
class Solution {
public:
int mySqrt(int x) {
int lo = 0, hi = x;
if( lo == hi|| lo == hi - 1){return hi;}
//有待改进的地方,做了一个穷举的 *** 作
//原因就在于你的二分查找不能包含lo = hi的情况
while(lo < hi){
int mid = lo + (hi - lo) / 2;
//要考虑可能
if ( (long long)mid * mid < x){
lo = mid + 1;
}
else if ((long long)mid * mid == x){
return mid;
}
else{
hi = mid;
}
}
return --lo;
}
};
//对于最终情况的考虑:二分法如果用闭区间,最终情况是只有一个数字
//这个数字一定是大于等于答案的。
//等于答案很简单,因为这个二分查找本来就是减而治之,减到单位长的的区间
//大于答案是什么情况呢,就是没找着,所以当没找着的时候
//看需要返回的是适当的插入位置,还是取个比他小的最大整数呢
//前者直接返回lo就行了,但是后者就得--lo了,具体情况具体分析
这里的mid*mid可能会越界因为俩int相乘还是int型,所以可能会越界,所以强转成long long类型
同样还有一种方法就是利用 x/mid和mid相比,可以防止溢出,这么玩就不必强转类型了。
class Solution {
public:
int mySqrt(int x) {
int l = 0, r = x, ans = -1;
while (l <= r) {
int mid = l + (r - l) / 2;
if ((long long)mid * mid <= x) {
ans = mid;
l = mid + 1;
} else {
r = mid - 1;
}
}
return ans;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/sqrtx/solution/x-de-ping-fang-gen-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
上边是标准答案,妙处在于,它每次都不去考虑中间的mid了,而是用一个答案变量给它储存住,等到最后的时候,
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)