通用算法 -[二分查找] - 細節問題

1、二分查找的若干細節問題

二分查找的思路很簡單,但是卻有很多問題需要注意,比如:
(1) while循環條件中什麼時候是<=,什麼時候是<?
(2) middle什麼時候加1,什麼時候不加1?
(3)當不存在查找的數時怎麼處理?

2、細節問題的解釋

針對以上問題,下面這篇文章很好的解釋了這些細節問題:
文章:詳解二分查找算法
總結來說,分爲以下幾種情況:
(1)當left,right都是閉區間時,while循環條件應該爲<=,這時的終止條件爲left = right + 1,對應的搜索區間爲[left,right]=[right + 1, right],很明顯,這時區間不存在任何元素,可以停止搜索;另外由於左右都是閉區間,所以當nums[middle] 不等於target時,應該在刨除nums[middle]上的區間繼續搜索,即left = middle + 1(在nums[middle]的右側搜索)或者right= middle - 1(在nums[middle]左側搜索);

(2) 當left爲閉,right爲開時,while循環條件應該爲<,這時終止條件爲left = right,對應搜索區間爲[left, right)= [right,right),區間不存在任何元素,停止搜索;另外,由於左閉右開,所以當nums[midddle] 不等於target時,應在刨除middle的區間上繼續搜索,即right = middle (在nums[middle]左側搜索)或left = middle +1(在nums[middle]的右側搜索)

(3) 但while循環條件爲<時,由於終止條件爲left=right,此時搜索區間還存在一個元素,但循環卻已經終止,爲防止這個元素被遺漏,需要添加一個補丁,判斷nums[left]是否等於target

//target查找或左邊界搜索
return nums[left] == target ? left : -1;

//右邊界搜索
return nums[left-1] == target ? (left-1) : -1;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章