題目
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
基本思路
二維數組是有序的,比如下面的數據:
1 2 3
4 5 6
7 8 9
可以直接利用左下角數字開始查找:
大於:比較上移
小於:比較右移
代碼思路
將二維數組看作平面座標系
從左下角(0,arr.length-1)開始比較:
目標值大於座標值---x座標+1
目標值小於座標值---y座標-1
注意:
二維數組arri中
j代表x座標
i代表y座標
代碼
function Find(target, array) {
let i = array.length - 1; // y座標
let j = 0; // x座標
return compare(target, array, i, j);
}
function compare(target, array, i, j) {
if (array[i] === undefined || array[i][j] === undefined) {
return false;
}
const temp = array[i][j];
if (target === temp) {
return true;
}
else if (target > temp) {
return compare(target, array, i, j+1);
}
else if (target < temp) {
return compare(target, array, i-1, j);
}
}
拓展:二分查找
二分查找的條件是必須有序。
和線性表的中點值進行比較,如果小就繼續在小的序列中查找,如此遞歸直到找到相同的值。
function binarySearch(data, arr, start, end) {
if (start > end) {
return -1;
}
var mid = Math.floor((end + start) / 2);
if (data == arr[mid]) {
return mid;
} else if (data < arr[mid]) {
return binarySearch(data, arr, start, mid - 1);
} else {
return binarySearch(data, arr, mid + 1, end);
}
}