「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」
- 相关文章
LeetCode刷题汇总:LeetCode刷题
一、题目描述
猜数字游戏的规则如下:
每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。 你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):
-1:我选出的数字比你猜的数字小 pick < num 1:我选出的数字比你猜的数字大 pick > num 0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num 返回我选出的数字。
二、思路分析
+ 看看题目的示例,我们来理一理这个思路~
+ 示例 1:
1
2
ini复制代码输入:n = 10, pick = 6
输出:6
+ 示例2:
1
2
ini复制代码输入:n = 1, pick = 1
输出:1
+ 示例3:
+ 1
2
ini复制代码输入:n = 2, pick = 1
输出:1
+ 示例4:
+ 1
2
ini复制代码输入:n = 2, pick = 2
输出:2
+ 重点是这个,不要被迷惑了!
- -1 : 我的数字比较小
- 1 : 我的数字比较大
- 0 : 恭喜!你猜对了!
+ 这个`-1` 指的是真实的结果比较小,换个说法就是你猜的结果大,不是你猜的小!不要被误导!三、AC 代码
=======
+ 二分法YYDS!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ini复制代码public class Solution extends GuessGame{
public int guessNumber(int n){
int low=1,high=n;
while(low<=high){
//防止mid越界爆掉, /2
int mid=low+(high-low)/2;
//调用guess
int res=guess(mid);
if(res!=0){
if(res==-1){
high=mid-1;
}else {
low=mid+1;
}
}else{
return mid;
}
}
return 0;
}
}
+ 执行结果:
+ 
+ 做完之后我又去找了找其他大神们的解法,发现基本上都是使用二分法来解决的,不过他们写的更加简洁明了!
+ 个人感觉这题就是表达很让人误解,其实最终的目的是让我们尽量少调用 `guess`方法来找到分割点。
+ 还有就是`mid`的值,不要越界!可以通过 `/2` 或者直接使用`long`来接收!
路漫漫其修远兮,吾必将上下求索~
如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah
本文转载自: 掘金