力扣69——X的平方根

题目描述
给定一个非负整数,求它的开方,向下取整。
输入输出样例
输入一个整数,输出一个整数。
Input: 8
Output: 2

8 的开方结果是 2.82842…,向下取整即是 2。
题解
可以把这道题想象成,给定一个非负整数 x,求 f (a) =a^2 − x= 0 的解。

因为我们只考虑 x≥ 0,所以 f (a) 在定义域上是单调递增的。
考虑到 f (0) = −x ≤ 0, f (x) = x^2 − x ≥ 0,粗略的讲上线定为X
我们可以对 [0, x ] 区间使用二分法找到 f (a) = 0 的解。

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

class Solution {
public:
    int mySqrt(int x) {
        if(x==0) return x;
        int l=1, r=x, mid, sqrt;
        while(l<=r){
            mid =l+(r-l)/2;
            sqrt=x/mid;
            if(sqrt==mid){
                return mid;
            }else if(mid>sqrt){
                r=mid-1;
            }else {
                l=mid+1;
            }
        }
        return r;
    }
};

力扣69——X的平方根

上一篇:69. x的平方根


下一篇:WDS,注意事项,双向验证等