説明
検索 K行および列の目最小数はマトリックスをソートします。
各行及び行列の各列が増分です。
例
例1:
Input:
[
[1 ,5 ,7],
[3 ,7 ,8],
[4 ,8 ,9],
]
k = 4
Output: 5
例2:
Input:
[
[1, 2],
[3, 4]
]
k = 3
Output: 3
チャレンジ
O *(* klogn)時間、 nは 行列の幅と高さの最大値です。
アイデア:
あなたは、バイナリヒープに使用されるか、またはO(することができるklognの時間の複雑さの問題を解決します)。
ヒープで解決します:
最初の列要素の最初の行に開始して、小さなヒープルートを定義します。
サイクル K K回、毎時間採取要素は、右へのヒープに要素以下の要素こと K Kは、応答エレメントにかかる時間です。
前記要素が記録される繰り返し、スタックのニーズに注意を払っていません。
二分法:
バイナリ答え、すなわち、最小および最大間隔からなる初期間隔マトリックス。
ミッド行列のランク間隔バイナリプロセスの中間点をtであると仮定される検索
- tは==、すなわち、ポイントは、結果のkである場合
- 、T> Kであれば区間[L、ミッド - 1]に
- T <K、区間[ミッド+ 1、R]になら
パブリッククラスソリューション{ / ** * @paramマトリックス:整数の行列 * @paramのK:アン整数 * @return:マトリックス内のk番目の最小の数 * / クラス対{ 公共のint X、Y、ヴァル。 公共のペア(int型のx、int型Y、INTヴァル){ this.x = X。 this.y = Y。 this.val =ヴァル; } } クラスPairComparator実装コンパレータ<ペア> { パブリックINTは比較(ペア、対B){ a.val返す- b.val。 } } INT [] DY =新しいINT [] {1,0}。 公共のint kthSmallest(INT [] []行列、int型K){ INT [] DX =新しいINT [] {0、1}。 IF(next_x <N && next_y <M &&!ハッシュ[next_x] [next_y]){ INT、N = matrix.length。 INT、M =マトリックス[0] .LENGTH。 [] []ハッシュ=新しいブール[n]は[m]を論理値。 優先度つきキュー<ペア>のminheap =新しい優先度つきキュー<ペア>(K、新しいPairComparator())。 minHeap.add(新しいペア(0、0、行列[0] [0])); 用(INTがI = 0、I <K - 1; I ++){ ペアCUR = minHeap.poll()。 用(INT J = 0であり、j <2、J ++){ int型next_x = cur.x + DX [J]。 INT next_y = cur.y + DY [J]。 一対next_Pair新しいペア(next_x、next_y、0)=。 next_Pair.val =行列[next_x] [next_y]。 minHeap.add(next_Pair)。 ハッシュ[next_x] [next_y] = TRUE; } } } 戻りminHeap.peek()ヴァル。 } }