目录
题目:
示例:
分析:
代码:
题目:
示例:
分析:
题目就是让我们猜数字,要猜中的数字为1~n,并且给我们提供一个api,传入一个数字表示是我们猜的数,api会告诉我们是猜大了还是猜小了,如果我们猜大了会返回-1,猜小了会返回1,猜对了就会返回0,我们再将猜中的数字返回。
如果从1开始猜到n,那么是会超时的,那么这道题是经典的二分查找题,所以我们使用二分查找法来做,使用二分查找法我们可以每次都排除一半的数,也就是说不管数字多大,我们都最多只需要猜㏒₂n次,这样就不会超时了。
那么二分的做法大家多多少少都清楚,就是有些细节需要注意,也就是缩小返回的时候重新更新左边界和右边界在不同的情况下该怎么更新,四种写法我下面都列出来了,大家可以看着参考一下。
代码:
左闭右闭:
class Solution {
public:
int guessNumber(int n) {
int l=1;int r=n; //左闭右闭
int mid,temp;
while(l<=r){
mid=l+(r-l)/2; //防止r+l溢出
temp=guess(mid);
if(temp==1) l=mid+1;
else if(temp==-1) r=mid-1;
else return mid;
}
return mid;
}
};
左开右闭:
class Solution {
public:
int guessNumber(int n) {
int l=0;int r=n; //左开右闭
int mid,temp;
while(l<=r){
mid=l+(r-l)/2+1; //防止r+l溢出
temp=guess(mid);
if(temp==1) l=mid;
else if(temp==-1) r=mid-1;
else return mid;
}
return mid;
}
};
左闭右开:
class Solution {
public:
int guessNumber(int n)
int l=1;long r=static_cast<long>(n)+1; //左闭右开
int mid,temp;
while(l<=r){
mid=l+(r-l)/2; //防止r+l溢出
temp=guess(mid);
if(temp==1) l=mid+1;
else if(temp==-1) r=mid;
else return mid;
}
return mid;
}
};
左开右开:
class Solution {
public:
int guessNumber(int n) {
int l=0;long r=static_cast<long>(n)+1; //左开右开
int mid,temp;
while(l<=r){
mid=l+(r-l)/2; //防止r+l溢出
temp=guess(mid);
if(temp==1) l=mid;
else if(temp==-1) r=mid;
else return mid;
}
return mid;
}
};