1. 程式人生 > 實用技巧 >劍指offer04.二維陣列中的查詢

劍指offer04.二維陣列中的查詢

在一個 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





演算法流程:
從矩陣 matrix 左下角元素(索引設為 (i, j) )開始遍歷,並與目標值對比:
 

matrix[i][j] > target 時,執行 i-- ,即消去第 i 行元素;
  matrix[i][j] < target 時,執行 j++ ,即消去第 j 列元素;
  matrix[i][j] = target 時,返回 true ,代表找到目標值。
 行索引或列索引越界,則代表矩陣中無目標值,返回 false
 每輪 i 或 j 移動後,相當於生成了“消去一行(列)的新矩陣”, 索引(i,j) 指向新矩陣的左下角元素(標誌數),因此可重複使用以上性質消去行(列)。

複雜度分析
時間複雜度 O(M+N) :其中,N 和 M 分別為矩陣行數和列數,此演算法最多迴圈 M+N 次。
空間複雜度 O(1)O(1) : i, j 指標使用常數大小額外空間。

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        int i = matrix.size() - 1, j = 0;
        while(i >= 0 && j < matrix[0].size())
        {
            if(matrix[i][j] > target) i--;
            else if(matrix[i][j] < target) j++;
            else return true;
        }
        return false;
    }
};