題目
實現 int sqrt(int x)
函數。
計算並返回 x 的平方根,其中 x 是非負整數。
由於返回類型是整數,結果只保留整數的部分,小數部分將被捨去。
示例 1:
輸入: 4
輸出: 2
示例 2:
輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842...,
由於返回類型是整數,小數部分將被捨去。
函數原型
C
的函數原型:
int mySqrt(int x){}
邊界判斷
int mySqrt(int x){
if( x < 0 ) // 根號下不爲負數
return -1;
if( x == 0 )
return 0;
}
算法設計:二分
思路:平方根一定在 [1, x] 之間,那這個數有啥特點呢?
如, 的平方根是 , 的平方根是 。
得到一個判定條件:x / mid == mid
時,就是這個數。
int mySqrt(int x){
if( x < 0 ) // 根號下不爲負數
return -1;
if( x == 0 )
return 0;
if( x == 1 )
return 1;
int left = 0;
int right = x;
int mid;
while( left < right ){
mid = (left + right) / 2;
if( x / mid == mid ) // 找到解
return mid;
else if( x / mid < mid )
right = mid - 1;
else if( x / mid > mid )
left = mid + 1;
}
return (x / left < left ? left - 1 : left);
// 最後判斷找到的整數的平方是否大於x 也要用除法,防止越界
}
代碼的一點技巧:防溢出。
mid = ( left + (right - left + 1) )>> 1