二分搜尋小結-x的平方根

大寫的ZDQ發表於2019-03-14

二分查詢法作為一種常見的查詢方法,將原本是線性時間提升到了對數時間範圍,大大縮短了搜尋時間,具有很大的應用場景,而在LeetCode中,要運用二分搜尋法來解的題目也有很多,但是實際上二分查詢法的查詢目標有很多種,而且在細節寫法也有一些變化。

第一類: 需查詢和目標值完全相等的數

這是最簡單的一類,也是我們最開始學二分查詢法需要解決的問題,比如我們有陣列[2, 4, 5, 6, 9],target = 6,那麼我們可以寫出二分查詢法的程式碼如下:

def find(nums,target):
     l, r = 0, len(nums)-1
     while l < r:
          mid = l + (r-l)//2
          if nums[mid] == target:
               return mid
          elif nums[mid] < target:
               l = mid + 1
          else:
               r  = mid - 1
     return r
def main():

     nums = [1,2,4,6,8]
     target=8
     print(find(nums,target))
main()

第二類: 查詢第一個不小於目標值的數,可變形為查詢最後一個小於目標值的數

這是比較常見的一類,因為我們要查詢的目標值不一定會在陣列中出現,也有可能是跟目標值相等的數在陣列中並不唯一,而是有多個,那麼這種情況下nums[mid] == target這條判斷語句就沒有必要存在。比如在陣列[2, 4, 5, 6, 9]中查詢數字3,就會返回數字4的位置;在陣列[0, 1, 1, 1, 1]中查詢數字1,就會返回第一個數字1的位置。我們可以使用如下程式碼:

def find(nums,target):
     l, r = 0, len(nums)-1
     while l < r:
          mid = l + (r-l)//2
          if nums[mid] == target:
               return mid
          elif nums[mid] < target:
               l = mid + 1
          else:
               r  = mid

def main():

     nums = [0,1,1,1,1]
     target=1
     print(find(nums,target))
main()

69.實現 int sqrt(int x) 函式。

計算並返回 x 的平方根,其中 x 是非負整數。

由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。

示例 1:

輸入: 4
輸出: 2
示例 2:

輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842…,
由於返回型別是整數,小數部分將被捨去。

class Solution:
    def mySqrt(self, x: int) -> int:
        if x == 0:
            return 0
        if x == 1:
            return 1
        l, r = 0, x - 1
        while l <= r:
            mid = l + (r-l)//2
            if mid * mid <= x and (mid+1)*(mid+1) > x:
                return mid
            elif mid*mid > x:
                r = mid-1
            else:
                l = mid+1

相關文章