栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

力扣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了,而是用一个答案变量给它储存住,等到最后的时候,

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/331968.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号