var totalArr = [
[1, 3, 43, 55, 65],
[76, 87, 97, 123, 125],
[134, 146, 168, 456, 652]
];
假設(shè)有數(shù)組 totalArr
玷氏,每項(xiàng)的值都是遞增的罩抗,后一個(gè)數(shù)組比前一個(gè)數(shù)組的值都大铐望,現(xiàn)在希望在 totalArr
數(shù)組中查找是否存在其中一個(gè)某個(gè)值:
function find(arr, number) {
for (var i = 0; i < arr.length; i++) {
var lastValue = arr[i][arr[i].length - 1];
if (lastValue == number) {
return true;
}else if(lastValue > number) { // 范圍在當(dāng)前數(shù)組內(nèi)
return halfCut(arr[i], number);
}
}
return false;
}
function halfCut(arr, number) {
if (arr.length == 1) {
return arr[0] == number;
}
var midIndex = Math.floor(arr.length / 2);
var midValue = arr[midIndex];
if (midValue == number) {
return true;
}else if (number < midValue) {
return halfCut(arr.slice(0, midIndex), number);
}else{
return halfCut(arr.slice(midIndex+1, arr.length), number);
}
}
調(diào)用 find(totalArr, 66)
捌刮,返回 false
如庭,調(diào)用 find(totalArr, 146)
叹卷,返回 true
。
- 首先
find
通過循環(huán)數(shù)組每一次坪它,用數(shù)組最后的值與number
值做比較骤竹,如果相等,直接返回true
往毡,否則判斷number
是否比最后一個(gè)值大蒙揣,如果大則循環(huán)下一層繼續(xù)比較,如果小开瞭,則把該層數(shù)組和number
傳給halfCut
方法懒震。 -
halfCut
首先跳過長度是否為1
的判斷,獲取數(shù)組中間值惩阶,如果中間值與number
相等挎狸,直接返回true
,否則断楷,如果number
小于中間值锨匆,則用前半段再次調(diào)用halfCut
,直到剩下一個(gè)元素,比較是否與number
相等恐锣,不相等則可以肯定該數(shù)不在本數(shù)組中存在茅主。