安全オファー-1を証明する。次元配列のルックアップ(C ++ / Javaの)

トピック:

(同一の各一次元アレイの長さ)は、上から下に増加する順に、二次元アレイの各列を並べ替えるために、昇順ソートの順に左から右に、各行。完全な機能、例えば、二次元アレイと整数を入力し、配列の整数が含まれているか否かが判断されます。

分析:

要素の所与の二次元アレイは、次いで、激しい溶液時間複雑度は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、1620 ]

[23,30,34、50 ]

同様に、その列16の排除が配置され、銀行の前の要素を比較し続けます。

[ 1,3,5,7 ]

[10、1116,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。
            }
            他の{
                 返す 
            }
        }
        返す ;
    }
}

おすすめ

転載: www.cnblogs.com/silentteller/p/11762414.html