排除法二分查詢

2021-10-02 16:28:04 字數 2087 閱讀 1060

以找到目標元素為目的進行查詢,迴圈控制條件為while(left<=right),表示當left==right成立時,還要判斷left(right)值和目標值的關係。

基礎二分法將查詢陣列分成三部分:mid所在位置,mid左邊位置和mid右邊位置,如果nums[mid]==target,那麼直接返回mid,否則根據條件改變搜尋區間進行下一次搜尋。

存在的問題:

目標值在陣列中存在多個,但需要返回的是乙個邊界值,例如比小於等於target的第乙個值等。

從哪些元素不是目標元素考慮。思路是:根據mid位置的元素,排除不可能存在目標元素的空間,下一輪在可能存在目標元素的區間中查詢。

具體演算法:

1.迴圈條件while(left1.mid被分到左邊,即區間被分成[left, mid][mid+1, right]

if

(check

(mid)

)else

2.mid被分到右邊,即取鍵被分成[left, mid-1][mid, right]

if

(check

(mid)

else

中間數的一般取法

int mid =

(left + right)/2

;

如果left和right特別大可能發生整形溢位,改進的取法為:

int mid = left +

(right - left)/2

;

這種寫法幾乎不會發生溢位。

注意/運算子是向下取整的,因此int mid = left + (right - left) / 2這種寫法永遠不會取到區間的最右側元素。

在第二種邊界收縮行為中,待搜尋區間只有兩個值時可能會發生死迴圈。

因此取中間數時根據兩種邊界收縮行為分成兩種情況

1.mid分給左側區間,[left, mid][mid+1, right],此時mid向下取整

int mid = left +

(right - left)/2

;if(check

(mid)

else

2.mid分給右側區間,[left,mid-1][mid, right],此時mid向上取整

int mid = left +

(right - left)/2

;if(check

(mid)

else

int mid = (left + right) >>> 1;>>>為無符號右移,使用這種方法可以避免整形溢位

1.mid分給左側區間[left, mid][mid+1, right]

while

(left < right)

else

}

2.mid分給右側區間[left, mid - 1][mid, right]

while

(left < right)

else

}

參考leetcode演算法35題liweiwei1419大佬的解題,原文在這。

程式設計師殺人必備 排除法

今天我要講一下排除法,排除法是我在解決技術問題時,最常用的辦法。玩這遊戲,你需要對人物進行分類,對活與死分類,性別分類,姓名分類,職業分類,朝代分類等等。比如如果猜孫悟空,包含的屬性是 虛擬的,四大名著裡的,名字三個字的,師徒四人裡的,一一拆解。最終是把目標名字給揪出來。以我在技術群體裡玩這個遊戲的...

用排除法診斷半表半里證

半表半里是經方的重要概念之一。半表半里的陽證為少陽病,半表半里的陰證為厥陰病。半表半里證當治以 和 法。對於複雜病症,難以直接根據條文提綱判斷是否屬於半表半里證的,可以採取排除法。即排除了病位在表 在裡,那麼就可以判斷出是半表半里之證,再進一步結合寒熱 虛實的情況,判斷是偏於陽證的少陽病還是偏於陰證...

C 1003 我要通過!(排除法)

答案正確 的條件是 字串中必須僅有 p a t這三種字元,不可以包含其它字元 任意形如 xpatx 的字串都可以獲得 答案正確 其中 x 或者是空字串,或者是僅由字母 a 組成的字串 如果 apbtc 是正確的,那麼 apbatca 也是正確的,其中 a b c 均或者是空字串,或者是僅由字母 a ...