题目描述
Given a non-negative integer x
, compute and return the square root of x
.
Since the return type is an integer, the decimal digits are truncated, and only the integer part of the result is returned.
Note: You are not allowed to use any built-in exponent function or operator, such as pow(x, 0.5)
or x ** 0.5
.
Example 1:
Input: x = 4 Output: 2
Example 2:
Input: x = 8 Output: 2 Explanation: The square root of 8 is 2.82842..., and since the decimal part is truncated, 2 is returned.
Constraints:
0 <= x <= 2^31 - 1
解题思路
【C++】
1. 二分查找
class Solution {
public:
int mySqrt(int x) {
if(x <= 1) return x;
int l = 1, h = x;
while(l <= h) {
int mid = l+(h-l)/2, sqrt = x/mid;
if(sqrt == mid) return mid;
else if(sqrt < mid) h = mid-1;
else l = mid+1;
}
return h;
}
};
2. 牛顿迭代法牛顿迭代法_百度百科牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。
https://baike.baidu.com/item/%E7%89%9B%E9%A1%BF%E8%BF%AD%E4%BB%A3%E6%B3%95/10887580
class Solution {
public:
int mySqrt(int x) {
long a = x; // in case that int overflows
while (a * a > x) {
a = (a + x / a) / 2;
}
return a;
}
};
【Java】
1. 二分查找
class Solution {
public int mySqrt(int x) {
if (x <= 1) {return x;}
int l = 0, h = x;
while (l <= h) {
int mid = l + (h - l) / 2;
int sqrt = x / mid;
if (sqrt == mid) {return mid;}
else if (sqrt < mid) {h = mid - 1;}
else {l = mid + 1;}
}
return h;
}
}
2. 牛顿迭代法
class Solution {
public int mySqrt(int x) {
long a = x; // in case that int overflows
while (a * a > x) {
a = (a + x / a) / 2;
}
return (int) a;
}
}