安全性を証明して下さい[オファー]顔の質問04.二次元配列

タイトル

N×M個の二次元アレイでは、各列から昇順に上から下へ、各列をソートするソート昇順の順に左から右へ。完全な機能は、そのような二次元アレイと整数を入力し、配列の整数が含まれているか否かが判断されます。

例:
次のように既存の行列が掛け:

[
  [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]
]

ターゲット= 5考えると、trueを返します。
与えられたターゲット= 20は、falseを返します。

 

制限事項:

0 <= n <= 1000
0 <= m <= 1000

思考

[LeetCode 2次元マトリクスII] 240検索
対象に等しくない場合特徴のアレイによれば、あなたが左下または要素の右上から見始めることができ、直接の行を減らすか、または見つけることができます。

コード

時間計算量:O(N + M)
の複雑容量:O(1)

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

もう一つの方法

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
        if (matrix.empty()) return false;
        int row = matrix.size(), col = matrix[0].size();
        int i = 0, j = col - 1;
        while (i < row && j >= 0) {
            if (target == matrix[i][j]) return true;
            else if (target < matrix[i][j]) --j;
            else ++i;
        }
        return false;
    }
};
公開された18元の記事 ウォン称賛86 ビュー160 000 +

おすすめ

転載: blog.csdn.net/u013178472/article/details/105107381