Task:
思路:
【方法1】內置函數:
當然本題的初衷當然不是讓這樣做了,但是也要知道有一個內置函數可以用!
代碼:
class Solution {
public:
int mySqrt(int x) {
return sqrt(x);
}
};
【方法2】二分查找:
思路就是:
(1)初始化邊界i和j
(2)找到中點mid= (i+j) / 2
(3)res= mid * mid和結果比大小,剛好等於就返回結果,其他情況下更新邊界,然後繼續循壞就好了!
class Solution {
public:
int mySqrt(int x) {
// 由於在計算的中間過程可能會出現數據溢出,所以要用long long類型
long long i = 0;
long long j = x / 2 + 1;//非負整數n的平方根是不會大於(n/2 +1)的
while( i <= j){
long long mid = (i+j)/2;
long long res = mid * mid;
if(res == x) return mid;
else if( res<x ) i = mid + 1;
else j = mid - 1;
}
return j;
}
};
結果:
【方法3】牛頓法:
迭代法的效果要好太多,複雜度減少了而很多!
- 思路:這裏牛頓法我不是很明白,關於res = (res + x/res) /2
- 代碼:
class Solution {
public:
int mySqrt(int x) {
if (x==0) return 0;
double last = 0;
double res = 1;
while(res!=last){
last = res;
res = (res + x/res) / 2;
}
return int(res);
}
};
- 結果: