Der Weg des Front-End-Algorithmus zum Bürsten von Fragen – binäre Suche

1. Grundkonzepte

Die binäre Suche basiert auf 有序数组der Suche. Erstens gibt es drei Zeiger links, in der Mitte und rechts. Wenn 大于der Wert der Zahl angezeigt wird, auf die der mittlere Zeiger zeigt, bewegen Sie 小于den rechten Zeiger an eine Stelle vor dem mittleren Zeiger. .

Code

function finIndex(list, target) {
    
    
  let left = 0,right = list.length - 1,mid;

  while (left <= right) {
    
    
  	mid = Math.floor((right + left) / 2);
    if (list[mid] == target) return mid;
    else if (list[mid] < target) left = mid + 1;
    else if (list[mid] > target) right = mid - 1;
  }

  return -1;
}

Die binäre Suche kann auch eine Klasse abstrakter Probleme lösen, z. B. das Finden [0,0,0,0,0,1,1,1,1,]der Position der ersten 1 in einem Array oder der Position der letzten 0. Der Code hat sich im Vergleich zum Original nicht wesentlich geändert, nur der Unterschied zwischen der Bewegung des linken und rechten Zeigers vor und nach dem mittleren Zeiger.

2. Thema

1. Quadratwurzel von x

Quadratwurzel von x

Gedankengang

Diese Frage ist eine abstrakte Frage zum Finden der letzten 0. Das heißt, die vorherigen kleiner oder gleich x werden als 0 aufgezeichnet, diejenigen größer als x werden als 1 aufgezeichnet und die letzte 0 ist die Antwort auf diese Frage.

der Code

/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
    
    
    let left = 0,right = x,mid = Math.floor((left+right)/2);
     // 避免计算超界 mid  = head + ((tail - head) / 2.0);
     
    while(right-left>2){
    
    	//防止死循环
    	mid*mid > x ? right = mid-1 : left = mid
        mid = Math.floor((left+right)/2)
    }

    for(let i=left;i<=right;i++){
    
    	//少于3项用for循环遍历
        if(i*i>x){
    
    
            mid = i-1
            break
        }else{
    
    
            mid = i
        }
    }

    return mid
};

Da das ursprüngliche Problem als Funktion betrachtet werden kann f(x)=√x, können wir die feste 100Anzahl anpassen, um die Zielzahl zu ermitteln. Da jede 2-Punkt-Anpassung den zu durchsuchenden Bereich um die Hälfte reduziert, beträgt der anzupassende Bereich bei 100-facher 2-Punkt-Anpassung 1/100 von 2 und der Unterschied zwischen dem linken und dem rechten Zeiger beträgt nur 1/100 von 2 und nehmen Sie dann den ganzzahligen Teil des linken Zeigers.

var mySqrt = function(x) {
    
    
    let left = 0,right = x,mid;
    right += 1;
    for(let i = 0; i < 100;i++){
    
    
        // 避免计算超界
        mid  = left + ((right - left) /2.0);
        if(mid * mid <= x) left = mid;
        else right = mid;
    }
    return Math.floor(left);
};

Supongo que te gusta

Origin blog.csdn.net/m0_49343686/article/details/119542872
Recomendado
Clasificación