1. 程式人生 > 其它 >【劍指OFFER 004】二維陣列中的查詢

【劍指OFFER 004】二維陣列中的查詢

技術標籤:劍指OFFER題解leetcode

題目

在一個 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。
黃色區域的數均小於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)