LeetCode 69. Sqrt(x) (x的平方根)

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

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

示例 1:

输入: 4
输出: 2
示例 2:

输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 
     由于返回类型是整数,小数部分将被舍去。
  1. 二分查找
  2. 本题是二分查找第四种变体的应用:找最后一个小于等于给定值的元素
class Solution {
    public int mySqrt(int x) {
        //结果肯定在[1, 2... sqrt(x)]之间的  “最后一个”“小于等于” 给定值的元素
        int num = (int)Math.sqrt(x);
        //区间里元素的个数
        int len = 0;
        for(int i = 1; i <= num; i ++) {
            len ++;
        }

        int left = 0, right = len - 1;

        while(left <= right) {
            int mid = left + (right - left) / 2;
            
            // 不能写为:((mid+1)*(mid+1)) > x,防止溢出
            // mid作为下标索引,而元素是以1开始的
            if((mid + 1) > x / (mid + 1)) {
                right = mid - 1;
            }
            else if((mid + 1) <= x / (mid + 1)) {
                //找最后一个 小于等于给定值的元素
                if(mid == len - 1 || (mid + 2) > x / (mid + 2)) {
                    return mid + 1;
                }
                else {
                    left = mid + 1;
                }
            }
        }

        //若输入0,则返回0
        return 0;
    }
}

在这里插入图片描述

发布了581 篇原创文章 · 获赞 97 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/gx17864373822/article/details/104866535