実際のアルゴリズム(a)は、2つの数の和

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 }

 

    

おすすめ

転載: www.cnblogs.com/litterCoder/p/11372519.html