力扣69. Sqrt(x)(二分解法)

力扣69. Sqrt(x)(二分解法),第1张

力扣69. Sqrt(x)(二分解法)
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了,而是用一个答案变量给它储存住,等到最后的时候,

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/3976809.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-10-21
下一篇 2022-10-21

发表评论

登录后才能评论

评论列表(0条)

保存