题目描述
实现 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;
}
};