【劍指OFFER 004】二維陣列中的查詢
阿新 • • 發佈:2020-12-22
題目
在一個 n * m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個高效的函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
樣例
現有矩陣 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
給定 target = 5,返回 true。
給定 target = 20,返回 false。
思路:
重點是發現規律,即右上角的數永遠比本行左邊的數,小於本列右邊的數。比如15大於[1,4,7,11],小於[19,22,24,30]。
在下圖中,黃色區域的數都小於x,綠色區域的數都大於x。
所以從右上角的數開始掃描。
① target = x : 返回true。
② target > x:說明x左邊的的數均小於target,所以可以排除一整行的數,即讓縱座標+1.
③ target < x: 說明x下邊的數均大於target,所以可以排除一整列的數,即讓橫座標+1.
class Solution {
public:
bool findNumberIn2DArray(vector< vector<int>>& matrix, int target) {
if(matrix.empty() || matrix[0].empty()) return false;
int m = matrix.size(), n = matrix[0].size();
int i = 0, j = n - 1;
while(i < m && j >= 0){
if(target == matrix[i][j]) return true;
if (target > matrix[i][j]) i ++ ;
else j -- ;
}
return false;
}
};
時間複雜度:O(n + m)
空間複雜度: O(1)