/**
* Index: 69
* Title: Sqrt(x)
* Author: ltree98
**/
题意
对于给定的值进行开根号运算
- 给定的值保证为非负数
- 结果取整,舍弃小数部分
我的
思路
利用二分思想,进行查找。
最低位为1,最高位为x/2,然后用二分进行查找,最后得到的数值需要-1处理。
还有一点,第一次比较用的是 mid*mid < x;但这样会在x较大时导致溢出,所以,稍微修改,用了 mid < x / mid。
时间复杂度:O(logn)
空间复杂度:O(1)
实现
class Solution {
public:
int mySqrt(int x) {
if(x <= 1)
return x;
int low = 1, high = x/2;
while(low <= high) {
int mid = (low + high) / 2;
if(mid < x / mid) {
low = mid + 1;
}
else if(mid > x / mid ) {
high = mid - 1;
}
else {
return mid;
}
}
return low-1;
}
};
进阶
思路
有人用经典的 牛顿迭代法来实现,代码行数更短,更简练。
不过为了避免溢出情况,用了 long类型。
迭代法在精确度要求高的时候,对于二分法的优势更明显,在这道题其实差不太多。
时间复杂度:O(logn)
空间复杂度:O(1)
实现
class Solution {
public:
int mySqrt(int x) {
long r = x;
while (r*r > x)
r = (r + x/r) / 2;
return r;
}
};