題目描述
實現 int sqrt(int x) 函數。
計算並返回 x 的平方根,其中 x 是非負整數。
由於返回類型是整數,結果只保留整數的部分,小數部分將被捨去。
示例 1:
輸入: 4
輸出: 2
示例 2:
輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842…,
- 由於返回類型是整數,小數部分將被捨去。
解題思路
我們可以把這道題想象成,給定一個非負整數 a,求 f(x) = x2 −a = 0 的解。因爲我們只考慮 x ≥ 0,所以 f(x)在定義域上是單調遞增的。考慮到 f(0) = −a ≤ 0,f(a) = a2 −a ≥ 0,我們可以對[0,a]區間使用二分法找到 f(x) = 0的解。
注意,在以下的代碼裏,爲了防止除以0,我們把 a = 0的情況單獨考慮,然後對區間[1,a] 進行二分查找。
使用了左閉右閉的寫法。
AC
class Solution {
public:
int mySqrt(int x) {
if(x==0) return 0;
long left=1,right=x,ans;
long mid;
while(left<=right){
mid = (left+right)/2;
ans = x/mid;
if(ans == mid) return ans;
else if(ans < mid) right = mid-1;
else left = mid+1;
}
return right;
}
};