LeetCode 69. x 的平方根 【二分查找】

题目描述

实现 int sqrt(int x) 函数。

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

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

示例 1:

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

输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,

  • 由于返回类型是整数,小数部分将被舍去。

解题思路

我们可以把这道题想象成,给定一个非负整数 a,求 f(x) = x2 −a = 0 的解。因为我们只考虑 x ≥ 0,所以 f(x)在定义域上是单调递增的。考虑到 f(0) = −a ≤ 0,f(a) = a2 −a ≥ 0,我们可以对[0,a]区间使用二分法找到 f(x) = 0的解。

注意,在以下的代码里,为了防止除以0,我们把 a = 0的情况单独考虑,然后对区间[1,a] 进行二分查找。

使用了左闭右闭的写法。

AC

class Solution {
public:
    int mySqrt(int x) {
        if(x==0) return 0;
        long left=1,right=x,ans;
        long mid;
        while(left<=right){
            mid = (left+right)/2;
            ans = x/mid;
            if(ans == mid) return ans;
            else if(ans < mid) right = mid-1;
            else left = mid+1;
        }
        return right;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章