19. x 的平方根
题目描述
实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

解题思路
设 x 的平方根的最终结果为 index。我们可以分析 index 左右两边数据的特点:
- 在区间 [0, index] 之间的元素,其平方值都小于等于 x;
- 在区间 [index+1, x] 之间的元素,其平方值都大于 x。
这种单调性非常适合使用二分查找算法来逼近目标值。
代码实现
class Solution {
public:
int mySqrt(int x) {
int left = 0;
int right = x;
while (left < right) {
// 注意:当 right=INT_MAX 时,right - left + 1 可能超出 int 最大值
// 所以需要强转成 long long 类型防止溢出
int mid = left + ((long long)right - left + 1) / 2;
if ((long long)mid * mid <= x) {
left = mid;
} else {
right = mid - 1;
}
}
return left;
}
};
关键点总结

这里需要特别注意 mid 的计算方式。为了避免死循环,当 right = mid 时, 应该向上取整(即加 1),这样在 和 相邻时, 会偏向 ,从而保证 能够推进。




