1.题目描述:实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
2.思路:比较 mid * mid 跟 x 的大小,相等则直接返回 mid,否则就去以 mid 为分割点的左右区间去查找,循环直到 left > right 退出。x (x ≠ 0) 的平方根一定是落在 [1, x/2 + 1] 区间,所以取 left = 1, right = x/2 + 1,而不取 right = x 。为了防止 mid * mid 太大,取 mid 跟 x/mid 进行比较。
3.Code:
int mySqrt(int x){
int left = 1, right = x / 2 + 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (mid > x / mid) {
right = mid - 1;
} else if (mid < x / mid) {
left = mid + 1;
} else {
return mid;
}
}
return right;
}
结果: