[69]. x 的平方根

 


題目

實現 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] 之間,那這個數有啥特點呢?

如,44 的平方根是 2299 的平方根是 33

4 / 2=2                9 / 3=34~ / ~2 = 2~~~~~~~~~~~~~~~~9 ~ / ~ 3 = 3

得到一個判定條件: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章