題目詳情:
在一個二維數組array中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
例如:
[ [1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15] ]
給定 target = 7,返回 true。
給定 target = 3,返回 false。
數據范圍:矩陣的長寬滿足 0≤n,m≤500 , 矩陣中的值滿足0≤val≤10^9
進(jin)階:空(kong)間(jian)(jian)復雜度(du) O(1) ,時間(jian)(jian)復雜度(du) O(n+m)
解題思路:
從二維數組的右上角開始,即初始位置為第一行的最后一列。
比較當前位置的元素與目標整數的大小關系:
如果當前元素等于目標整數,則返回 True。
如果當前元素大于目標整數,由于當前元素下方的元素一定更大,因此我們需要向左移動一列,即 col -= 1。
如果當前元素小于目標整數,由于當前元素左側的元素一定更小,因此我們需要向下移動一行,即 row += 1。
重復步驟 2,直(zhi)到(dao)找到(dao)目標整數(shu)或超出數(shu)組邊界,此時返回 False。
代碼實現:
function searchIn2DArray(array, target) {
if (!array || array.length === 0 || array[0].length === 0) {
return false;
}
const rows = array.length;
const cols = array[0].length;
let row = 0;
let col = cols - 1;
while (row < rows && col >= 0) {
if (array[row][col] === target) {
return true;
} else if (array[row][col] > target) {
col--;
} else {
row++;
}
}
return false;
}
// true
console.log(searchIn2DArray(
[[1, 2, 8, 9],
[2, 4, 9, 12],
[4, 7, 10, 13],
[6, 8, 11, 15]], 7))