讓我們一起啃演算法----x 的平方根

三斤和他的喵發表於2020-04-29

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 協議》,轉載必須註明作者和本文連結

三斤

相關文章