leetCode69. x 的平方根
题目思路
常见的二分法模板(背过就行,模板而已)
// 区间[L,R]被划分为[L,mid]和[mid + 1, R]时使用这个模板
int bsearch_1(int l, int r){
while(l < r){
int mid = l + r >> 1;
if(check(mid)) r = mid; //check()判断mid是否满足性质
else l = mid + 1;
}
return l;
}
// 区间[L,R]被划分为[L,mid - 1]和[mid, R]时使用这个模板
int bsearch_2(int l, int r){
while(l < r){
int mid = l + r + 1 >> 1; // 加1进行补偿:原因是当mid = left会陷入死循环(记住即可)
if(check(mid)) l = mid; //check()判断mid是否满足性质
else r = mid - 1;
}
return l;
}
此题代码
class Solution {
public:
int mySqrt(int x) {
int left = 0, right = x;
while(left < right){
int mid = 1ll + left + right >> 1; // 防止越界,强制转换为long long类型的
// if(mid * mid <= x) left = mid;// 模板二,需要对mid 补偿 + 1
// mid * mid会越界,所以做一些优化
if(mid <= x / mid) left = mid;
else right = mid - 1;
}
return left;
}
};