博主介绍:?目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。
涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。
博主所有博客文件目录索引:博客目录索引(持续更新)
视频平台:b站-Coder长路
来源:LeetCode专题《LeetCode 75》
题目链接:LeetCode、374. 猜数字大小
类型:基础算法/二分
思路:
注意点:对于l + r可能会爆int,我们可以使用一个临时long存储,接着再转为int。
对于猜测的数若是<=目标值,那么区间范围为[l, mid],若是>目标值,区间值范围[mid + 1, r],在本题中由于一定能够命中某一个值,那么最终的结果就一定是l或者r。
代码:
复杂度分析:时间复杂度O(logn);空间复杂度O(1)
/**
* Forward declaration of guess API.
* @param num your guess
* @return -1 if num is higher than the picked number
* 1 if num is lower than the picked number
* otherwise return 0
* int guess(int num);
*/
public class Solution extends GuessGame {
public int guessNumber(int n) {
int l = 1, r = n;
while (l < r) {
//取到中间值 (long)l + r >> 1 会超时,会构成这样的效果(long)l + (r >> 1)
//我们的目的应该是((long)l + r) >> 1
long tmp = ((long)l + r) >> 1;//临时使用long存储
int mid = (int)tmp;
int pick = guess(mid);
//若是<=,那么区间为[l, mid],若是> 则为[mid + 1, r]
if (pick <= 0) {
r = mid;
}else {
l = mid + 1;
}
}
return l;
}
}
大家点赞、收藏、关注、评论啦~
精彩专栏推荐订阅:在下方专栏👇🏻
更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅
整理者:长路 整理时间:2024.1.19