题目描述
给定一个非负整数,求它的开方,向下取整。
输入输出样例
输入一个整数,输出一个整数。
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;
}
};