Every day a leetcode
题目来源:374. 猜数字大小
解法1:二分
设begin=1,end=n,mid为两者的均值。
基于二分查找的思想:
- guess(mid) == -1:我选出的数字比你猜的数字小 pick < mid,取左区间,end = mid - 1;
- guess(mid) == 1:我选出的数字比你猜的数字大 pick > mid,取右区间,begin = mid + 1;
- guess(mid) == 0:我选出的数字和你猜的数字一样。返回mid。
注意mid = (begin + end) / 2会爆int,导致Runtime error,应该用mid = begin + (end - begin) / 2。
代码:
/*
* @lc app=leetcode.cn id=374 lang=cpp
*
* [374] 猜数字大小
*/
// @lc code=start
/**
* 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);
*/
class Solution
{
public:
int guessNumber(int n)
{
int begin = 1, end = n, mid, ans;
while (begin < end)
{
// mid = (begin + end) / 2;
mid = begin + (end - begin) / 2;
if (guess(mid) == -1)
{
end = mid - 1;
}
else if (guess(mid) == 1)
{
begin = mid + 1;
}
else
return mid;
}
return begin;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(logn),时间复杂度即为二分的次数,每次二分我们将区间的长度减小一半,直至区间长度为1时二分终止,而区间初始长度为n,因此二分次数为O(logn)。
空间复杂度:O(1)。