二分查詢的幾種情況彙總

2021-09-29 23:58:44 字數 3362 閱讀 8580

在學習演算法和刷leetcode的過程中,二分查詢是一種非常常見的演算法。功能方面,它將查詢的複雜度從o(n)降成了o(lgn)。使得查詢效率大大提高。在leetcode中,有諸多關於二分查詢的變體。因此,掌握好二分查詢是非常有必要的。但是,在實際學習過程中,對於二分可能出現的各種情況,我查閱了很多部落格和文章,大家給出的**不統一,也大多沒有給出詳細的解釋。所以,有一段時間,二分演算法的幾種情況在我腦中亂糟糟的。今天終於花了一些時間把這些情況理清楚了。所以將這幾種情況寫在這裡,以便複習。

二分查詢的主要情況分成7中情況:

1. 查詢對應target位置(返回對應位置,沒找到則返回-1)

2. 查詢第乙個大於或等於target的位置(返回對應位置,沒找到則返回-1)

3. 查詢第乙個大於target的位置(返回對應位置,沒找到則返回-1)

4. 查詢最後乙個小於等於target的位置(返回對應位置,沒找到則返回-1)

5. 查詢最後乙個小於target的位置(返回對應位置,沒找到則返回-1)

6. 查詢第乙個等於target的位置(返回對應位置,沒找到則返回-1)

7. 查詢最後乙個等於target的位置(返回對應位置,沒找到則返回-1)

另外,本文中都是在陣列的閉區間內進行查詢,而且預設陣列已經是增序排列。

1. 查詢對應target位置(返回對應位置,沒找到則返回-1)

對應**為:

def find(nums,target):

low = 0

high = len(nums)-1

while low <= high:

mid = low + (high - low)//2

if nums[mid] == target:

return mid

elif nums[mid] < target:

low = mid + 1

else:

high = mid - 1

return -1

2. 查詢第乙個大於或等於target的位置(返回對應位置,沒找到則返回-1)

def find(nums,target):

low = 0

high = len(nums)-1

while low <= high:

mid = low + (high - low)//2

if nums[mid] >= target:

high = mid - 1

elif nums[mid] < target:

low = mid + 1

if low <= len(nums)-1:

return low

else:

return -1

3. 查詢第乙個大於target的位置(返回對應位置,沒找到則返回-1)

def find(nums,target):

low = 0

high = len(nums)-1

while low <= high:

mid = low + (high - low)//2

if nums[mid] > target:

high = mid - 1

elif nums[mid] <= target:

low = mid + 1

if low <= len(nums)-1:

return low

else:

return -1

4. 查詢最後乙個小於等於target的位置(返回對應位置,沒找到則返回-1)

def find(nums,target):

low = 0

high = len(nums)-1

while low <= high:

mid = low + (high - low)//2

if nums[mid] <= target:

low = mid + 1

elif nums[mid] > target:

high = mid - 1

if high >= 0:

return high

else:

return -1

5. 查詢最後乙個小於target的位置(返回對應位置,沒找到則返回-1)

def find(nums,target):

low = 0

high = len(nums)-1

while low <= high:

mid = low + (high - low)//2

if nums[mid] < target:

low = mid + 1

elif nums[mid] >= target:

high = mid - 1

if high >= 0:

return high

else:

return -1

6. 查詢第乙個等於target的位置(返回對應位置,沒找到則返回-1)

def find(nums,target):

low = 0

high = len(nums)-1

while low <= high:

mid = low + (high - low)//2

if mid[mid] >= target:

high = mid - 1

else:

low = mid + 1

if low <= len(nums)-1 and nums[low] == target:

return low

else:

return -1

7. 查詢最後乙個等於target的位置(返回對應位置,沒找到則返回-1)

def find(nums,target):

low = 0

high = len(nums)-1

while low <= high:

mid = low + (high - low)//2

if nums[mid] <= target:

low = mid + 1

else:

high = mid - 1

if high >= 0 and nums[high] == target:

return high

else:

return -1

二分入門 二分知識 及 幾種情況

二分排序 時間複雜度是 log n 最壞的情況下是 n 乙個條件是帶查詢陣列是有序的,分兩種 一公升序 而降序 主要思路就是指定兩個指標start end 分別指向陣列元素的兩端,然後比較陣列中間的arrat mid 和待查詢元素,n 直接找到某值在右若干個 n時 找n 以下是 若找到中間值是n則輸...

二分查詢演算法的幾種實現

template typename t intbinary search const vector set,const t value return 1 template typename forwardit,class t bool binary search forwardit frist,fo...

迭代二分查詢二分查詢

在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...