69.Sqrt(x)

136 阅读1分钟

[69.Sqrt(x)]

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。

题目描述

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5

示例

示例 1:

输入: x = 4
输出: 2

示例 2:

输入: x = 8
输出: 2
解释: 8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

提示:

  • 0 <= x <= 2^31 - 1

思路

经过之前的二分查找的算法题,今天继续使用一道算法题来强化二分查找。按照我们之前总结的步骤来。首先,在这道题里面,我们还是在一个在有序的数组中,找到特定的一个值。而这个值求平方小于等于x的最大整数,结合题目要求,数组是从0到target的连续整数。并且是结果必定存在。明确使用二分查找之后,下来就是明确区间的定义了,这里区间的定义不妨定义为 [1,target]。 接下来便是判断函数,即 x*x <target。下来就可以用代码来实现了。

代码实现

我们使用左闭右闭的写法来解决这道题:

class Solution {
    public int mySqrt(int x) {
        int left=1, right=x;
        while(left<=right){
            int mid = (left+right)/2;
            //防止溢出,改用除法判断
            int mi = x/mid;
            if(mi == mid) return mid;
            else if(mi < mid){
                right = mid-1;
            }
            else{
                left = mid+1;
            }
        }
        return right;
    }
}

while 循环与之前总结的一致。而我们为了防止溢出,另外求了一个mi,这里的mi在最后一次循环中满足mi*mid<=x,(mi+1)*mid+>x,恰好满足我们求平方小于等于x的最大整数的要求。 明确这一点,下面的判断与是否+-1就不难理解了(有效区间)。

总结

上述内容对二分查找进行了复习,另外针对了整型除法中存在的截断问题。