件名の説明:
https://leetcode-cn.com/problems/search-a-2d-matrix-ii/submissions/
目標行列対象のM×nの行列を検索するために効率的なアルゴリズムにより調製。この行列は、次の特徴があります。
昇順の各行の要素は左から右へ。
昇順に上から下に、各列の要素。
例:
次のように既存の行列が掛け:
[
[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、戻り真。
与えられたターゲット= 20は、falseを返します。
トピック分析:
1、タイトルを初めて目には、私は、なぜまたは中難易度それを得るために2つのサイクルに直接この質問を感じますか?暴力的な解決策によると、提出後に彼らはありませんが、非常に長い時間を持つことができます。
2、暴力の時間のかかるソリューションの原因は次のとおりです。プログラムは、探索空間のすべてを取ります。
3、最近のイデオロギー分割統治でちょうど見て、分割統治の記述はおそらく考えている:シンプルなサブ問題に複雑な問題を分割し、次いで溶液の問題児の最終的なソリューションに統合。
図4に示すように、タイトル行と列がそうヘッドバイナリサーチの飛び出し、昇順である、二分探索法は、分割統治のアイデアを使用することです。
図5に示すように、二分探索方法について昇順構造線形、ターゲットを検索し、ターゲットは第一の中間値であってもよいが、直鎖構造を比較し、見つかった目標値を表す中間値に等しく、それは中間値を超えた場合、ターゲットラインできます半分の構造の後、
中間値よりも小さい、ターゲット構造ラインの半分であってもよく、前のステップを繰り返して、あなたは最終的に最終的な結果を得るでしょう、そして、約50%の探索空間占有率;
行と列が昇順であるため、二分法を使用して、この問題は、最適な点がある場合6、は、二分法の行または列に小さい幅を使用することが可能です。
Javaコード&バックル力の業績---暴力行為:
パブリック ブール searchMatrix1(INT [] []行列、INT ターゲット){ 場合(matrix.length == 0 ){ 戻り 偽。 } INT colSize =行列[0 ] .LENGTH。 用(INT [] int値:行列){ ため(INT J = 0; J <colSize; J ++ ){ 場合(int値[J] == ターゲット){ 戻り 真。 } } } リターン 偽; }
Javaコード&バックル力の業績 ---二分法:
パブリック ブール searchMatrix2(INT [] []行列、INT ターゲット){ 場合(matrix.length == 0 ){ 戻り 偽。 } のための(INT [] int値:行列){ ブール結果= binarySearch(0、ints.length - 1 、int値、ターゲット) もし(結果){ 戻り 真。 } } を返す 偽。 } プライベート ブール binarySearch(int型開始、INTの端、INT [] NUMS、int型のターゲット){ 場合(<=開始端){ int型中間=(+端を開始)>> 1 。 もし(NUMS [中間] == ターゲット){ 戻り 真。 } そう であれば(NUMS [中間]> ターゲット){ リターン binarySearch(中央、開始- 1 、NUMS、ターゲット) } 他{ リターン binarySearch(1 +真ん中、終わり、NUMS、ターゲット) } } リターン はfalse ; }
Javaコード&バックル力の業績 ---最適化の二分法: