原题
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 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…, 截掉小数部分,返回2.
两种方法
二分法
//二分法 超时了不知道对错
int mySqrt(int x){
long long i = 0;
long long j = (x + 1)/2;
while (i <= j)
{
long long mid = (i + j) / 2;
long long sq = mid * mid;
if (sq == x) return mid;
else if (sq < x) i = mid + 1;
else j = mid - 1;
}
return j;
}
牛顿法
x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_{n}-\frac{f\left(x_{n}\right)}{f^{\prime}\left(x_{n}\right)} xn+1=xn−f′(xn)f(xn)
最终代码
int mySqrt(int x) {//二分法
if (x <= 0) return 0;
int a = 1;
// -1避免溢出
int b = (x == INT_MAX) ? (x - 1) : x;
while (a < b) {
if (b - a == 1) return a;
//二分取中点
int m = (a + b) / 2;
//判断当前中点与平方根的关系
int d = m - (x / m);
//如果d为零说明 m是平方根,而且平方根是一个整数
if (d == 0) return m;
//如果d小于0说明 m小于平方根
if (d < 0) a = m;
//如果d大于0说明 m小于平方根
else b = m;
}
return a;
}
总结:
- leetcode里面是32位的变量,所以int最大值为2147483647,而不是16位的32767