704 Binäre Suche

704. Binäre Suche

Verknüpfung

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 targetebenfalls gleich 5. Wenn Sie die Schreibmethode while(left < right)verwenden , rightsollte die Initialisierung auf 1 und leftdie Initialisierung auf 0 erfolgen. Und wenn Sie while(left <= right)die Notation , sollte diese auf 0 initialisiert werdenleft . rightDer 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 = 3verwenden wir while(left < right)die Notation , um die binäre Sortierung zu implementieren.

In dieser Schreibweise left = 0,right = 7ist der Vorgang in der Abbildung dargestellt

Der Schlüssel zum Code ist nums[mid] < nums[right], dass when , right = mid. Im Zyklus rightgibt 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 = 3verwenden 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 rightbefindet 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
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/jiaweilovemingming/article/details/125063997
conseillé
Classement