其他分享
首页 > 其他分享> > 剑指offer72:求平方根

剑指offer72:求平方根

作者:互联网

题目:
给定一个非负整数 x ,计算并返回 x 的平方根,即实现 int sqrt(int x) 函数。
正数的平方根有两个,只输出其中的正数平方根。
如果平方根不是整数,输出只保留整数的部分,小数部分将被舍去。
输入: x = 8
输出: 2
解释: 8 的平方根是 2.82842…,由于小数部分将被舍去,所以返回 2
输入: x = 4
输出: 2
分析:
假如输入的非负整数是n,从0开始每次增加1,对于每个整数m,判断m^2是否小于或等于n,如果找到一个m,并且满足m ^2 <=n 和(m+1) ^2>n,那么m就是n的平方根,这种操作的时间复杂度为O(n ^1/2)。
根据数学常识对于每个整数m,判断m^2是否小于或等于n,如果找到一个m,并且满足m ^2 <=n 和(m+1) ^2>n,就得到这个平方根,例如8的平方根是2,2的平方小于8并且2+1的平方大于8.可以采用二分查找法,时间复杂度为O(logn),具体见代码
代码:

public class MySqrt {
    public int mySqrt(int n) {
    //除0之外的平方根一定在从1到n的范围内
        int left = 1;
        int right = n;
        while (left <= right) {
            int mid = (left + right) / 2;
//            mid*mid有可能会溢出,所以采用mid <=n/mid
            if (mid <= n/mid) {
                if ((mid + 1) > n/(mid+1)) {
                //满足两个条件才返回
                    return mid;
                }
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return 0;
    }
}

在这里插入图片描述

标签:right,offer72,int,mid,整数,平方根,left
来源: https://blog.csdn.net/Jiaodaqiaobiluo/article/details/121572404