题目地址:69. Sqrt(x)
解题思路:这道题虽然说是简单题,但是还是卡了我不少时间的。
首先是mid
的条件,一开始我写的是mid=(low+high)/2
,但是看大佬们的题解,都写成了mid = low + (high - low) / 2
,说是这样效率更高,我实测也比我之前的写法少了0.3MB
内存消耗。
其次是我似乎陷入了一种思维定式,之前写了mid*mid==x
这个多余的if条件,这也是可以改进的地方。
最后就是对特殊值0,1
的处理,避免多余的运算,以及计算平方的时候转换为long
类型,防止超出Int
的上限。
最为灵性的是要知道一个数的平方根不会大于这个数的一半
,这样可以极大减少计算量(缩短约一半)
class Solution {
public int mySqrt(int x) {
if (x == 0) {
return 0;
}
if (x == 1) {
return 1;
}
int low = 0;
//一个数的平方根不会超过一个数的一半(0和1除外)
int high = x/2;
int ans = -1;
while (low <= high) {
int mid = low + (high - low) / 2;
if ((long) mid * mid > x) {
high = mid - 1;
} else {
ans = mid;
low = mid + 1;
}
}
return ans;
}
}