704. Binäre Suche
Schreiben Sie bei einem gegebenen geordneten (aufsteigenden) Integer-Array nums mit n Elementen und einem Zielwert target eine Funktion, um das Ziel in nums zu durchsuchen, und geben Sie den Index zurück, wenn der Zielwert vorhanden ist, andernfalls geben Sie -1 zurück.
Beispiel 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
Beispiel 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
Hinweis:
- Sie können davon ausgehen, dass alle Elemente in Zahlen eindeutig sind.
- n wird zwischen [1, 10000] liegen.
- Jedes Element von Zahlen liegt im Bereich [-9999, 9999].
Gedankengang
Für das Problem, den Zielwert in einem geordneten, sich nicht wiederholenden Array zu finden , kann die binäre Suche in Betracht gezogen werden.
Wie im Titel erwähnt, werden alle Elemente in Nums nicht wiederholt und Nums sind in aufsteigender Reihenfolge angeordnet , sodass die binäre Suchmethode in Betracht gezogen werden kann.
Die Logik der binären Suche ist relativ einfach, bei der Verarbeitung von Randbedingungen können jedoch leicht Fehler gemacht werden. Wir schreiben zum Beispiel while(left < right)
und while(left <= right)
die entsprechenden Verarbeitungsmethoden sind völlig unterschiedlich.
Um ein einfaches Beispiel zu geben: Angenommen, das Array enthält nur ein Element 5 und der Zielwert ist target
ebenfalls gleich 5. Wenn Sie die Schreibmethode while(left < right)
verwenden , right
sollte die Initialisierung auf 1 und left
die Initialisierung auf 0 erfolgen. Und wenn Sie while(left <= right)
die Notation , sollte diese auf 0 initialisiert werdenleft
. right
Der Unterschied zwischen den beiden Schreibmethoden liegt also im Umgang mit Randbedingungen .
Daher verfügt die binäre Suche entsprechend der Verarbeitungsmethode der Randbedingungen über die folgenden zwei Schreibmethoden.
erste Schreibweise
Unter der Annahme, dass die Array-Elemente , sind [1,2,3,4,5,6,7]
, target = 3
verwenden wir while(left < right)
die Notation , um die binäre Sortierung zu implementieren.
In dieser Schreibweise left = 0,right = 7
ist der Vorgang in der Abbildung dargestellt
Der Schlüssel zum Code ist nums[mid] < nums[right]
, dass when , right = mid
. Im Zyklus right
gibt es ein offenes Intervall, hier sollte es auch ein offenes Intervall geben, konsistent bleiben .
Der entsprechende Code lautet wie folgt: ( Kotlin )
class Solution {
fun search(nums: IntArray, target: Int): Int {
var left = 0
var right = nums.size // [left,right) 右侧为开区间,right 设置为 nums.size
while (left < right) {
val mid = (left + right) / 2
if (nums[mid] < target) left = mid + 1
else if (nums[mid] > target) right = mid // 代码的核心,循环中 right 是开区间,这里也应是开区间
else return mid
}
return -1 // 没有找到 target ,返回 -1
}
}
zweite Schreibweise
Unter der Annahme, dass die Array-Elemente , sind [1,2,3,4,5,6,7]
, target = 3
verwenden wir while(left <= right)
die Notation , um die binäre Sortierung zu implementieren.
Bei dieser Schreibweise „links = 0, rechts = 76“ ist der Vorgang in der Abbildung dargestellt
Der Schlüssel zum Code ist nums[mid] < nums[right]
, dass when , right = mid - 1
. In der Schleife right
befindet sich ein geschlossenes Intervall, und es sollte auch hier ein geschlossenes Intervall sein, damit es konsistent bleibt .
Der entsprechende Code lautet wie folgt: ( Kotlin )
class Solution {
fun search(nums: IntArray, target: Int): Int {
var left = 0
var right = nums.size - 1 // [left,right] 右侧为闭区间,right 设置为 nums.size - 1
while (left <= right) {
val mid = (left + right) / 2
if (nums[mid] < target) left = mid + 1
else if (nums[mid] > target) right = mid - 1 // 代码的核心,循环中 right 是闭区间,这里也应是闭区间
else return mid
}
return -1 // 没有找到 target ,返回 -1
}
}