以找到目標元素為目的進行查詢,迴圈控制條件為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 ...