トピック:
分析:
要素の所与の二次元アレイは、次いで、激しい溶液時間複雑度はO(n ^ 2)、テストに合格することができないかどうかを決定します。
2次元配列が実際に注文さを考えると、左から右への各行は増加しており、上から下へ、各列は、私たちがより迅速に問題を解決することができ、この機能の使用の増加です。
そして、我々は右上から指定された整数要素を比較し始めることができ、要素の右上隅には、このような特徴があるのでそれは小さいですが、それよりも次の要素が大きく、左の要素よりも、与えられた整数比であればそれは、それよりも小さい指定された整数、それは大きいよりも、この要素列ならば、それはこの整数は含まれませんしながら、それはもはや、この整数を持つことができ、それは小さいよりも、このラインの大、平均要素ではありません我々は比較たびに、あなたが行、または要素のリストを除外することができ、そのような効率が非常に高いです。
目標= 11、二次元配列は、以下:
[1,3、5、7 ]
[10,11,16,20]
[23,30,34,50]
第1の比較7 <11は、したがって、我々は、最初の行、本比較カラムの次の要素を除外します。
[ 1,3,5,7 ]
[10,11,16、20 ]
[23,30,34,50]
20> 11ので、私たちはこのコラム、銀行の前の要素の比較を除外する。
[ 1,3,5,7 ]
[10,11、16、20 ]
[23,30,34、50 ]
同様に、その列16の排除が配置され、銀行の前の要素を比較し続けます。
[ 1,3,5,7 ]
[10、11、16,20 ]
[23,30、34,50 ]
この要素11を最後に見つけ、trueを返すことができます。O(M + N)の時間計算量、すなわち、二次元アレイとランク。
手順:
C ++
クラスのソリューション{ パブリック: BOOL検索(int型のターゲット、ベクトル<ベクトル< int型 >> 配列){ 場合(array.empty())を返す 偽。 INT、M = array.size()。 INT、N =配列[ 0 ] .size()。 INT X = 0 。 INT Y = N 1 ; 一方、(X <M && Y> = 0 ){ もし(配列[X] [Y]> ターゲット){ そして - 。 } そう であれば(配列[X] [Y] < ターゲット){ ++ X。 } 他の{ 返す 真。 } } 返す 偽; } }。
ジャワ
パブリック クラスソリューション{ パブリック ブール検索(int型のターゲット、int型[] []配列を){ 場合(配列== nullの)を返します 偽。 INT、M = Array.lengthと。 INT、N =配列[0 ] .LENGTH。 INT X = 0 。 INT Y = N-1 。 一方、(X <M && Y> = 0 ){ もし(配列[X] [Y]> ターゲット){ - ; Y } そう であれば(配列[X] [Y] < ターゲット){ ++ X。 } 他の{ 返す 真。 } } 返す 偽; } }