1. 二分查找

二分查找注意要點(diǎn):

1.數(shù)組為有序組且無重復(fù)元素,因為一旦有重復(fù)元素,使用二分查找法返回的元素下標(biāo)可能不是唯一的,這些都是使用二分法的前提條件。

  1. 二分查找涉及的很多的邊界條件,區(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í)用)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容