二分查找解題模板

所謂模板只是爲了在解決相關問題時提供一個較好的出發點,具體細節還應根據具體的題目進行調整。

二分查找模板

二分查找在解題過程中經常出現,如查找target是否在給定的數組中存在、查找包含重複元素的數組中某一個數target對應的左右邊界或查找旋轉數組的旋轉點……相比較於線性掃描O(N)O(N)的實際複雜度,二分查找的時間度爲O(logN)O(\log N)


查找target在nums中是否存在?


[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5XpurHQC-1585468940179)(C:\Users\dyliang\AppData\Roaming\Typora\typora-user-images\image-2020032915563423

 def binarySearch(nums, target):
      left = 0
      right = len(nums) - 1

      while left <= right:
          mid = left + (right - left) // 2
          if nums[mid] == target:
              return mid
          elif nums[mid] < target:
              left = mid + 1
          elif self.nums[mid] > target:
              right = mid - 1
      
      return -1

查找target在nums中的左邊界


在這裏插入圖片描述

 def findLeftBound(nums, target):
      left = 0
      right = len(nums) - 1

      while left <= right:
          mid = left + (right - left) // 2
          if nums[mid] == target:
              right = mid - 1
          elif nums[mid] < target:
              left = mid + 1
          elif nums[mid] > target:
              right = mid - 1
              
return left if left <= len(nums)-1 and nums[left] == target else -1

查找target在nums中的右邊界


在這裏插入圖片描述

def findRightBound(nums, target):
      left = 0
      right = len(nums) - 1

      while left <= right:
          mid = left + (right - left) // 2
          if nums[mid] == target:
              left = mid + 1
          elif nums[mid] < target:
              left = mid + 1
          elif nums[mid] > target:
              right = mid - 1

      return right if right >= 0 or nums[right] == target else -1 

完整測試模板

class BinarySearch:
    def __init__(self, nums, target):
        self.nums = nums
        self.target = target


    def binarySearch(self):
        left = 0
        right = len(self.nums) - 1

        while left <= right:
            mid = left + (right - left) // 2
            if self.nums[mid] == self.target:
                return mid
            elif self.nums[mid] < self.target:
                left = mid + 1
            elif self.nums[mid] > self.target:
                right = mid - 1
        
        return -1

    def findLeftBound(self):
        left = 0
        right = len(self.nums) - 1

        while left <= right:
            mid = left + (right - left) // 2
            if self.nums[mid] == self.target:
                right = mid - 1
            elif self.nums[mid] < self.target:
                left = mid + 1
            elif self.nums[mid] > self.target:
                right = mid - 1

        return left if left <= len(self.nums)-1 and self.nums[left] == self.target else -1


    def findRightBound(self):
        left = 0
        right = len(self.nums) - 1

        while left <= right:
            mid = left + (right - left) // 2
            if self.nums[mid] == self.target:
                left = mid + 1
            elif self.nums[mid] < self.target:
                left = mid + 1
            elif self.nums[mid] > self.target:
                right = mid - 1

        return right if right >= 0 or self.nums[right] == self.target else -1 

 
if __name__ == "__main__":
    # 簡單二分查找
    # nums = [1,2,3,4,5,6]
    # target = 2
    # bs = BinarySearch(nums, target)
    # print (bs.binarySearch())
	
    # 查找左邊界
    # nums = [1,2,2,2,3,4]
    # target = 2
    # bs = BinarySearch(nums, target)
    # print (bs.findLeftBound())
	
    # 查找右邊界
    nums = [1,2,2,2,3,4]
    target = 2
    bs = BinarySearch(nums, target)
    print (bs.findRightBound())

關於更多如邊界條件的設置等關鍵坑詳讀二分查找解題套路框架,強推!

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