[LeetCode 240] 2DマトリックスIIを検索



Search 2d Matrix Ii



の値を検索する効率的なアルゴリズムを作成します m バツ n マトリックス。このマトリックスには、次のプロパティがあります。

  • 各行の整数は、左から右に昇順でソートされます。
  • 各列の整数は、上から下に昇順で並べ替えられます。

例:



次のマトリックスについて考えてみます。

5

ターゲット= trueが与えられた場合、20を返します。



ターゲット= falseが与えられた場合、class Solution { public: bool searchMatrix(vector& matrix, int target) { int row = matrix.size() if (row == 0) return false int col = matrix[0].size() int i = row - 1 int j = 0 while (i >= 0 && j target) { i -- } else if (matrix[i][j] を返します。

分析

このトピックでは、実際には暴力的な検索方法を使用して、質問者の本来の意図ではないと推定しています。行または各行または列のリストをトラバースすると、m * lognまたはn * logmのバイナリ検索時間計算量が実行されます。



私はまた、インターネット上で他の人の巧妙な解決策を見ました。実際、2次元配列の左下隅から始めることができます。 matrix [i] [j]がターゲットよりも大きい場合は、[0、i] [0、j]の範囲を決定できます。この範囲の数は彼よりも少ないので、([i] [j]の左上隅)にターゲットがあってはなりません。次に、右側のターゲット、つまりj ++を探します。 matrix [i] [j]> targetの場合、[i] [j]の右下隅にターゲットがないはずなので、検索します。つまり、i--です。

コード

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

運用効率

実行時間:92ミリ秒、Search a 2D MatrixIIのC ++オンライン送信の35.38%より高速。

メモリ使用量:13 MB、Search a 2D MatrixIIのC ++オンライン送信の5.28%未満。