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
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 100
Anzahl 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);
};