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条)