二分查找注意要點(diǎn):
1.數(shù)組為有序組且無重復(fù)元素,因為一旦有重復(fù)元素,使用二分查找法返回的元素下標(biāo)可能不是唯一的,這些都是使用二分法的前提條件。
- 二分查找涉及的很多的邊界條件,區(qū)間的定義就是不變量。要在二分查找的過程中,保持不變量,就是在while尋找中每一次邊界的處理都要堅持根據(jù)區(qū)間的定義來操作,這就是循環(huán)不變量規(guī)則。區(qū)間的定義一般為兩種,左閉右閉即[left, right],或者左閉右開即[left, right)。
3. 二分查找一般由三個主要部分組成:
預(yù)處理 —— 如果集合未排序,則進(jìn)行排序。
二分查找 —— 使用循環(huán)或遞歸在每次比較后將查找空間劃分為兩半。
后處理 —— 在剩余空間中確定可行的候選者。
題目示例:
給定一個 n 個元素有序的(升序)整型數(shù)組 nums 和一個目標(biāo)值 target ,寫一個函數(shù)搜索 nums 中的 target,如果目標(biāo)值存在返回下標(biāo),否則返回 -1。704. 二分查找 - 力扣(LeetCode)
左閉右閉
class Solution:
def search(self, nums: List[int], target: int) -> int:
left,right=0,len(nums)-1
while left <=right:
middle=(left+right)//2
if target<nums[middle]:
right=middle-1
elif target > nums[middle]:
left=middle+1
else:
return middle
return -1
左開右閉
class Solution:
def search(self, nums: List[int], target: int) -> int:
if len(nums)==0:
return -1
left,right=0,len(nums)
while left <right:
middle=(left+right)//2
if target<nums[middle]:
right=middle
elif target > nums[middle]:
left=middle+1
else:
return middle
return -1
(本文僅作為個人復(fù)習(xí)用)