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. 結語
努力去愛周圍的每一個人,付出,不一定有收獲,但是不付出就一定沒有收獲! 給街頭賣藝的人零錢,不和深夜還在擺攤的小販討價還價。願我的博客對你有所幫助(*^▽^*)(*^▽^*)!
如果客官喜歡小生的園子,記得關注小生喲,小生會持續更新(#^.^#)(#^.^#)。
