题目描述实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
样例描述
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
思路
- 二分法。如果一个数的平方大于x,则一定不是平方根,具备单调性,可以缩小区间进行搜索
- 处理越界。 将判断改成除法形式
- 注意先判断特殊值,LeetCode题的套路
代码
class Solution {
public int mySqrt(int x) {
//先判断特殊值
if (x == 0) return 0;
if (x == 1) return 1;
//利用数学特性,平方根肯定不会超过原数的一半
int left = 1, right = x / 2;
while (left < right){
int mid = left + (right - left + 1) / 2;
//不是< 带等号的
if (mid <= x / mid){
left = mid;
}else {
right = mid - 1;
}
}
return left;
}
}