x 的平方根(Qqrtx)
題幹:
實現 int sqrt(int x) 函式。
計算並返回 x 的平方根,其中 x 是非負整數。
由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。
示例 1:
輸入: 4
輸出: 2
示例 2:
輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842…, 由於返回型別是整數,小數部分將被捨去。
來源:力扣
解題思路
一個 大於 1 的正整數,記為 x,它的平方根一定是 大於等於 1,且小於等於 x 的二分之一,區間表示為 [1, x/2],由於題目規定 只保留整數部分,所以基於上面的分析,求平方根實際變成了:在 [1, x/2] 有序序列中尋找一個正整數 number。分析到這裡,是不是覺得和 讓我們一起啃演算法—-搜尋插入位置 有點像。
其實對於 在一個有序序列(如果無序,可以先對序列排序)中找某一個數 的題型都可以使用 二分查詢 的解題思路。
首先我們初始化 left 為 1, right 為 x / 2(取整數), mid = left + ( right - left ) / 2,V 為 mid * mid。
接著判斷 V 與 x 的大小。如果 V 小於 x,那麼將 left 設定為 mid + 1,right 不變,重新計算 mid 並重覆上面的比較。如果 V 大於 x,那麼將 right 設定為 mid - 1,left 不變,重新計算 mid 並重覆上面的比較。如果 V 等於 x,則返回 mid。直到 left >= right,表明在 [1, x/2] 中找不到一個整數恰好等於 x 的平方根,這時候就返回最接近這個平方根的整數,即 left。
注:在返回 left 的時候需要判斷 left * left 是否大於 x,如果大於的話,則返回 left - 1。
流程圖如下:
程式碼實現
GO語言實現
// 二分查詢 主要是操作 陣列的索引。
// 本題區間 [1, x/2] 因為是連續的正整數,完全可以當作陣列的索引使用,所以二分查詢可以直接使用,不需要做什麼轉換
func mySqrt(x int) int {
left := 1
right := x / 2
for left < right {
// 中間值
mid := left + (right - left) / 2
// 如果 中間值的平方 小於x,則移動left到mid的後一位
if mid * mid < x {
left = mid + 1
} else if mid * mid > x {
// 如果 中間值的平方 大於x,則移動right到mid的前一位
right = mid - 1
} else {
// 相等的話,mid就是x的平方根
return mid
}
}
// 判斷當前left的平方是否大於x
if left * left > x {
return left - 1
}
return left
}
總結
每天進步一點點,加油!
演算法教程專案,每天更新一題,點個 star 支援一下呀:
https://github.com/wx-satellite/learning-a…
本作品採用《CC 協議》,轉載必須註明作者和本文連結