题目描述
We are playing the Guess Game. The game is as follows:
I pick a number from 1
to n
. You have to guess which number I picked.
Every time you guess wrong, I will tell you whether the number I picked is higher or lower than your guess.
You call a pre-defined API int guess(int num)
, which returns 3 possible results:
-1
: The number I picked is lower than your guess (i.e.pick < num
).1
: The number I picked is higher than your guess (i.e.pick > num
).0
: The number I picked is equal to your guess (i.e.pick == num
).
Return the number that I picked.
Example 1:
Input: n = 10, pick = 6 Output: 6
Example 2:
Input: n = 1, pick = 1 Output: 1
Example 3:
Input: n = 2, pick = 1 Output: 1
Example 4:
Input: n = 2, pick = 2 Output: 2
Constraints:
1 <= n <= 231 - 1
1 <= pick <= n
解题思路
基础二分查找。
题意为A(原题中I)说一个数(x)让B(原题中You)猜,B每猜一个数(num)A就反馈是否正确,且反馈若不正确x和num的大小关系是怎样的,直到B猜出为止。
题目让写的函数int guessNumber(int n)的作用是利用题目已给的用于模拟A回答的函数int guess(int num)来模拟B的猜测过程。
查找有很多方式,从完成效率以及题目已给条件来看用二分查找解决:设首节点first和尾节点last,初始化查找范围为全范围,即初始化first=1和last=n,并计算中间数mid=(first+last)/2。令mid与被查找数x比较,若相同则查找成功;若不同则判断大小关系,若x>mid则赋值first=mid+1,若x<mid则赋值last=mid-1,以实现每次查找后都使查找范围减半,从而提升查找效率。
对于二分查找算法来说值得注意的是,二分查找的前提条件是被查找序列已在顺序状态下。
此外对于本题要注意数据规模,int不足以解决mid的计算,所以mid的类型为long long。
提交代码
/**
* Forward declaration of guess API.
* @param num your guess
* @return -1 if num is lower than the guess number
* 1 if num is higher than the guess number
* otherwise return 0
* int guess(int num);
*/
class Solution
{
public:
int guessNumber(int n)
{
long long first=1, last=n;
long long mid;
if(guess(n)==0) return n;
while(1)
{
mid=(first+last)/2;
if(guess(mid)==0) return mid;
if(guess(mid)==-1)
last=mid-1;
if(guess(mid)==1)
first=mid+1;
if(first>last) break;
}
return mid;
}
};
心得
第一次用LeetCode,只写一半代码很不适应,本来想本地写个完整的,但这两天太忙时间不允许。如果题目难的话大概还是得先自己写完整的再粘贴过来吧。