一魚多吃 用 二分搜尋的觀念,來解 Sqrt(x) 整數平方根 Leetcode #69

閱讀時間約 2 分鐘
raw-image

這題的題目在這裡

題目會給定一個輸入整數x,要求我們返回x的正整數平方根(取無條件捨去小數部分的正整數值)


測試範例:

Example 1:

Input: x = 4
Output: 2
Explanation: The square root of 4 is 2, so we return 2.

Example 2:

Input: x = 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since we round it down to the nearest integer, 2 is returned.



約束條件:

Constraints:

  • 0 <= x <= 231 - 1

演算法:

這題除了傳統正規的"牛頓逼近法"可以去計算平方根之外,

也可以使用之前學過的二分搜尋法來找。

二分搜尋法本身就適用於在已經排序好(不論遞增或遞減)的數列裡面做搜尋。

因為y = sqrt(x) 本身也是一個連續函數曲線,而且嚴格遞增

y = sqrt(x) 的函數圖

y = sqrt(x) 的函數圖

所以我們可以令
初始左端點為0右端點為x,每次用二分搜尋法,去尋找x的正整數平方根。(取無條件捨去小數部分的正整數值)


程式碼:

class Solution:
 def mySqrt(self, x: int) -> int:
  
  left, right = 0, x
  
  while left <= right:
   
   mid = left + (right - left) // 2
   square = mid * mid
   
   if square <= x:
    left = mid + 1
   
   elif square > x :
    right = mid -1
   
  
  return left-1

時間複雜度:

O( log n ) 每次削去一半不可能的區間,最多O(log n)回合可以找到答案。

遞迴關係式 T(n) = T(n/2) + O(1)

空間複雜度:

O( 1 ) 只有使用固定大小的臨時變數,占用的記憶體空間為常數級別O(1)。


學完這題,記得和最一開始的那一題 Binary Search 二分搜尋,做個對照喔,彼此的觀念和演算法原理都是相通的。

關鍵都在於每次取中心點,用二分法去逼近解答或者目標值


Reference:

[1] Python O( log n ) sol. based on binary search - Sqrt(x) - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
這題基本上是前一題巴斯卡三角形的孿生題,那題和這題的本質是完全一樣的,只是題目要求稍有不同。 前一題求的是整個巴斯卡三角形,這一題求的是巴斯卡三角形的最後一層。
在學習過比較基本的DP模型 費式數列、爬樓梯、找零錢...等之後, 來看一個比較進階而且實用的DP模型,前綴和(Prefix sum), 可以再加以延伸推廣,來計算 區間和(Range Sum)。
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
題目會給定一個陣列,長度為n,裡面的數字都是獨一無二,落在0~n的範圍。 要求我們找出那個不見的數字 Missing Number 註: (n+1)個數字,無法同時放入n個不同的格子,必定有一個數字不見了。
題目給定兩個字串s和t,t是s隨機打散後的字串,並且在t裡面額外多加了一個字元, 要求我們找出額外多加入的那個字元。
題目會給定一個陣列,每個數字都恰好出現兩次,只有一個數字是例外。 要求我們找出那個落單也就是例外的數字。
這題基本上是前一題巴斯卡三角形的孿生題,那題和這題的本質是完全一樣的,只是題目要求稍有不同。 前一題求的是整個巴斯卡三角形,這一題求的是巴斯卡三角形的最後一層。
在學習過比較基本的DP模型 費式數列、爬樓梯、找零錢...等之後, 來看一個比較進階而且實用的DP模型,前綴和(Prefix sum), 可以再加以延伸推廣,來計算 區間和(Range Sum)。
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
題目會給定一個陣列,長度為n,裡面的數字都是獨一無二,落在0~n的範圍。 要求我們找出那個不見的數字 Missing Number 註: (n+1)個數字,無法同時放入n個不同的格子,必定有一個數字不見了。
題目給定兩個字串s和t,t是s隨機打散後的字串,並且在t裡面額外多加了一個字元, 要求我們找出額外多加入的那個字元。
題目會給定一個陣列,每個數字都恰好出現兩次,只有一個數字是例外。 要求我們找出那個落單也就是例外的數字。
你可能也想看
Google News 追蹤
Thumbnail
本篇文章分享了一些常見的數學陷阱題目,並提供瞭解答與相應的陷阱由來。
  也就是說,這個題目最主要要考的東西其實遠遠不是兩個三位數相加那麼簡單。它要測驗的核心其實是「學生是否有辦法把應用題轉譯為算式,並計算出正確答案」。當我們帶著這份思考去重新看那道題目時,我們會發現這個我們成年人沒有看懂的要求,不僅僅是要學生寫出計算過程,更核心的是在確認「解題過程」。
Thumbnail
數學至理與淨土莊嚴(象山慶24.3.17)     有人說:       數學裡有個美好的詞,叫「求和」;有個遺憾的詞,叫「無解」;有個霸氣的詞,叫「有且僅有」;有個悲傷的詞,叫「無限接近卻永不相交」。還有個模糊的詞叫「約等於」,遙遠的詞叫「未知數」,單調的詞叫「無限循環」,堅定的詞叫「絕對值」
Thumbnail
在Python中,數值運算非常直觀,你可以使用標準的數學運算符號進行基本的數值運算。以下是一些基本的數值運算: 進行計算時,按照「先乘除後加減」的規則,並優先計算小括號刮起來的運算式。 print('答案:' ,(1+1)*2) #​答案: 4 復合型態的運算子 指定運算子 = 若是結合算術
Thumbnail
《底層邏輯》在【超閱讀觀點83】有介紹過,西恩之所以要把《底層邏輯2》再隔兩本介紹,主要原因在於,這本書是以許多人聞之色變的「數學」出發,把我們會遇到的「現象」用數學解釋,所以基本上,相較於《底層邏輯》的高易讀性,《底層邏輯2》顯然沒辦法讀那麼快,且更需要思考,不過能得到的收穫也更多。 《底層邏輯
Thumbnail
本篇文章分享了一些常見的數學陷阱題目,並提供瞭解答與相應的陷阱由來。
  也就是說,這個題目最主要要考的東西其實遠遠不是兩個三位數相加那麼簡單。它要測驗的核心其實是「學生是否有辦法把應用題轉譯為算式,並計算出正確答案」。當我們帶著這份思考去重新看那道題目時,我們會發現這個我們成年人沒有看懂的要求,不僅僅是要學生寫出計算過程,更核心的是在確認「解題過程」。
Thumbnail
數學至理與淨土莊嚴(象山慶24.3.17)     有人說:       數學裡有個美好的詞,叫「求和」;有個遺憾的詞,叫「無解」;有個霸氣的詞,叫「有且僅有」;有個悲傷的詞,叫「無限接近卻永不相交」。還有個模糊的詞叫「約等於」,遙遠的詞叫「未知數」,單調的詞叫「無限循環」,堅定的詞叫「絕對值」
Thumbnail
在Python中,數值運算非常直觀,你可以使用標準的數學運算符號進行基本的數值運算。以下是一些基本的數值運算: 進行計算時,按照「先乘除後加減」的規則,並優先計算小括號刮起來的運算式。 print('答案:' ,(1+1)*2) #​答案: 4 復合型態的運算子 指定運算子 = 若是結合算術
Thumbnail
《底層邏輯》在【超閱讀觀點83】有介紹過,西恩之所以要把《底層邏輯2》再隔兩本介紹,主要原因在於,這本書是以許多人聞之色變的「數學」出發,把我們會遇到的「現象」用數學解釋,所以基本上,相較於《底層邏輯》的高易讀性,《底層邏輯2》顯然沒辦法讀那麼快,且更需要思考,不過能得到的收穫也更多。 《底層邏輯