「这是我参与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:
输入:n = 10, pick = 6 输出:6
-
示例2:
输入:n = 1, pick = 1 输出:1
-
示例3:
-
输入:n = 2, pick = 1 输出:1
-
示例4:
-
输入:n = 2, pick = 2 输出:2
-
重点是这个,不要被迷惑了!
- -1 : 我的数字比较小
- 1 : 我的数字比较大
- 0 : 恭喜!你猜对了!
-
这个
-1
指的是真实的结果比较小,换个说法就是你猜的结果大,不是你猜的小!不要被误导!
三、AC 代码
-
二分法YYDS!
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