69 Sqrt(x) x 的平方根
Description:
Implement int sqrt(int x).
Compute and return the square root of x, where x is guaranteed to be a non-negative integer.
Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.
Example:
Example 1:
Input: 4
Output: 2
Example 2:
Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since
the decimal part is truncated, 2 is returned.
题目描述:
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例:
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
思路:
- 二分法, int最大值为2^31 - 1, 其平方根为46340
时间复杂度O(lgn), 空间复杂度O(1) -
牛顿法-wiki
原理类似基本不等式: a^2 + b^2 >= 2ab
时间复杂度O(lgn), 空间复杂度O(1)
代码:
C++:
class Solution
{
public:
int mySqrt(int x)
{
if (x <= 1) return x;
int low = 0, high = 46340;
while (low <= high)
{
int mid = (low + high) / 2;
if (mid * mid > x) high = mid - 1;
else if (mid * mid < x) low = mid + 1;
else return mid;
}
return low - 1;
}
};
Java:
class Solution {
public int mySqrt(int x) {
if (x <= 1) return x;
int low = 0, high = 46340;
while (low <= high) {
int mid = (low + high) / 2;
if (mid * mid > x) high = mid - 1;
else if (mid * mid < x) low = mid + 1;
else return mid;
}
return low - 1;
}
}
Python:
class Solution:
def mySqrt(self, x: int) -> int:
if x <= 1:
return x;
result = x;
while result > x / result:
result = (result + x / result) // 2
return int(result)