二分搜索(常規、左邊界、右邊界)


1.  概述

  二分查找的思想是在有序數組里根據中間值來收縮搜索空間。時間復雜度為O(log(n))。

2. Code實現

2.1 常規

 1 # 數組查找是否某個數,存在返回其下標,
 2     def binarySearch_any(self, nums, target):  3         if not nums or len(nums) == 0:  4             return -1
 5         n = len(nums)  6         # 左右均是閉區間
 7         left, right = 0, n - 1
 8         # <=: 閉區間[left, right]內查找
 9         # 若一直未找到,left = right + 1,寫成區間:[right + 1, right]
10         while left <= right: 11             # 方式left + right太大越界
12             mid = left + (right - left) // 2
13             # 找到
14             if nums[mid] == target: 15                 # *** 1. 直接返回 ***
16                 return mid 17             elif nums[mid] < target: 18                 # 注意
19                 left = mid + 1
20             elif nums[mid] > target: 21                 # 注意
22                 right = mid - 1
23         # 未找到
24         # *** 2. 直接返回 ***
25         return left

2.2 左邊界

# 返回排序數組中第一次出現的下標,記找左邊界
    def binarySearch_left(self, nums, target): if not nums or len(nums) == 0: return -1 n = len(nums) # 左右均是閉區間
        left, right = 0, n - 1
        # <=: 閉區間[left, right]內查找
        while left <= right: mid = left + (right - left) // 2
            if nums[mid] == target: # *** 1. 別返回,收縮右邊界,鎖定左邊界 ***
                right = mid - 1
            elif nums[mid] < target: # 搜索區間變為[mid, right]
                left = mid + 1
            elif nums[mid] > target: # 搜索區間變為[left, mid - 1]
                right = mid - 1
        # *** 2. 最后要檢查left越界情況 ***
        if left >= n or nums[left] != target: return -1
        return left

2.3 右邊界

# 返回排序數組中最后一次出現的下標,記找右邊界
    def binarySearch_right(self, nums, target): if not nums or len(nums) == 0: return -1 n = len(nums) # 左右均是閉區間
        left, right = 0, n - 1
        while left <= right: mid = left + (right - left) // 2
            if nums[mid] == target: # *** 1. 別返回,收縮左邊界,鎖定右邊界 ***
                left = mid + 1
            elif nums[mid] < target: # 搜索區間變為[mid + 1, right]
                left = mid + 1
            elif nums[mid] > target: # 搜索區間變為[left, mid - 1]
                right = mid - 1
        # *** 2. 最后要檢查right越界情況 ***
        if right < 0 or nums[right] != target: return -1
        return right

3. 結語

  努力去愛周圍的每一個人,付出,不一定有收獲,但是不付出就一定沒有收獲! 給街頭賣藝的人零錢,不和深夜還在擺攤的小販討價還價。願我的博客對你有所幫助(*^▽^*)(*^▽^*)!

  如果客官喜歡小生的園子,記得關注小生喲,小生會持續更新(#^.^#)(#^.^#)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM