/**
* 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;
}
};
本文探讨了两种求非负数平方根的有效算法:二分法和牛顿迭代法。通过二分查找确定最接近的整数平方根,避免了大数运算的溢出问题。牛顿迭代法则提供了更高的精度,适用于对结果精确度有高要求的场景。
406

被折叠的 条评论
为什么被折叠?



