I.はじめに
すべてに沿って、アルゴリズムは、学ぶことを学ぶことが、本当の問題解決、彼らが使用している場合は、ときに、プロジェクトのconding、起動しない、とは考えられないでしょう。最終的な分析では、または必要なトレーニングが不足している、今の毎日の問題に準拠し、ゼロから、leetcodeを磨くようになりました。
II。トピック
タイトル:整数配列NUMSと目標値の目標を考えると、配列内の二つの整数の目標値を特定し、その配列の添字に戻るにお願いします。
あなたは、各入力が一つだけ答えに対応することを想定することができます。ただし、同じ配列要素を再使用することはできません。
例:考えるNUMSの= [2、7、11、15]、目標= 9、NUMS [0] + NUMS [1] = 2 + 7 = 9、返されるので、[0、1]
III。問題解決のアイデア
1.一般的なアイデア:問題は、暴力的な解決策、2つの周期、第一の層配列の各要素に除去され、素子層の第一のグループの後に順次採取要素の第2の層とを発生することが考えられ、そして目標値の対象と一緒に2つの数値を比較します。コードは以下の通りであります:
1 クラスソリューション{ 2 公共の INT [] twoSum(INT [] NUMS、int型のターゲット){ 3 のための(int型、iはnums.lengthを<; I = 0 iは++ ){ 4 のための(int型 J = I + 1、J <NUMS .LENGTH; J ++ ){ 5 であれば(NUMS [I] + NUMS [J] == ターゲット){ 6 戻り 新しい INT [] {I、J}。 7 } 8 } 9 } 図10は、 スロー 新しいです例外:IllegalArgumentException(「いいえ2つのサム・ソリューション」); 11 } 12 }
解空間の複雑さはO(1)、時間複雑度はO(N ^ 2)です。
2.第二のアイデアは、最初の配列の最初の反復、ハッシュテーブルを解くことであるすべての要素、ハッシュテーブルに格納されたインデックスに対応する要素、及び第2の反復配列が順次除去要素の要素は、対象の目標値との差を計算し、ハッシュテーブルの違いかどうかを確認するために、インデックスが返され、この比較の要素(同一の要素を再利用していない)が存在し、ない場合差分値は、インデックスに対応します。コードは以下の通りであります:
1 クラスソリューション{ 2 公共の INT [] twoSum(INT [] NUMS、int型のターゲット){ 3 地図<整数、整数>ハッシュマップ= 新しいHashMapの()。 図4は、 のために(int型 i = 0; iはnums.length <; iは++ ){ 5 hashMap.put(NUMS [i]は、I)。 6 } 7 ための(int型 i = 0; iはnums.length <; iは++ ){ 8 のint NUM =ターゲット- NUMS [I]。 9 もし(hashMap.containsKey(NUM)&& hashMap.get(NUM)!= I){ 10 戻り 新しい INT [] {Iを、hashMap.get(NUM)}。 11 } 12 } 13 投 新しいはIllegalArgumentException( "NO 2つの和溶液" )。 14 } 15 }
解空間の複雑さはO(n)は、時間計算量はまた、O(N)です。
3.そこに要素の後、ハッシュテーブル、一部の人々は、それは同じ要素を再利用することができないと思うかもしれない、そのような解決策は、それを比較することができない場合には、上記を参照してください?これは、溶液中での私たちの第三、一つだけの繰り返しです。存在する場合以前のように、その後、ハッシュテーブルを検索し、その差を計算するために、何の放電素子は、ハッシュテーブルを置いていないが存在し、結果を返します。コードは以下の通りであります:
1 クラスソリューション{ 2 公共の INT [] twoSum(INT [] NUMS、int型のターゲット){ 3 地図<整数、整数>ハッシュマップ= 新しいHashMapの()。 4 のために(int型、iはnums.length <; I = 0 iは++ ){ 5 のint numは=ターゲット- NUMSを[I]。 6 場合(hashMap.containsKey(NUM)){ 7 戻り 新しい INT [] {I、hashMap.get(NUM)}。 8 } 9 hashMap.put(NUMS [i]は、I)。 10 } 11 スロー 新しい例外:IllegalArgumentException(「なし2つのサム・ソリューションを」); 12 } 13 }