这里分享一个二分查找算法的trick,我们知道二分查找是对一个已经排序对数组进行二分搜索,初始化一个left和right,left和right表示上界和下界。在每次循环中求mid,并不断更新left或right,直到找到最终的mid
但是二分查找有很多写法和细节,例如,
while(left<=right){
int mid = (left+right)/2;
if() left = mid+1;
else right = mid-1;
}
和
while(left<right){
int mid = (left+right)/2;
if() left = mid+1;
else right = mid;
}
这是因为
1.当left==right时,mid=left=right
若
left = mid+1;right=mid或
left = mid;right=mid-1
有可能一直死循环
所以
while(left<=right)时
left = mid+1;right=mid-1
参考
https://leetcode.com/problems/sqrtx/
这两种解法都是AC的:
class Solution {
public:
int mySqrt(int x) {
if(x==1) return 1;
long left=1, right=x;
while(left<=right){
int mid = (left+right)/2;
if(x/mid>=mid) left = mid+1;
else right = mid-1;
}
return left-1;
}
};
或
class Solution {
public:
int mySqrt(int x) {
if(x==1) return 1;
long left=1, right=x;
while(left<right){
int mid = (left+right)/2;
if(x/mid>=mid) left = mid+1;
else right = mid;
}
return left-1;
}
};