一般的なハッシュ・テーブルの操作-TwoSumの問題
3116 ワード
TwoSumの質問:
①、twosum入力は同じデータが存在せず、出力が一意である
質問の説明:整数配列
ソリューション:
1)、暴力的な解決方法を使用し、ネストされた遍歴を使用して、対応する要素の下付きを見つける
2)、ハッシュリストを使用します.具体的には以下の通りです.
まずmapコンテナrecordを設定し、要素の値とインデックスを記録し、配列を巡ります.
-』配列を巡回するたびに、一時変数complementを使用して、目標値と現在値との差を保存します.
-このループでrecordを検索し、complementと一致するかどうかを確認します.検索に成功した場合は、現在の検索値のインデックスと現在のループ値iを返します.
-が見つからない場合は、recordに要素値と下付きiを保存します.
コードは以下の通りである:時間複雑度O(n),空間複雑度O(n)
②、twosum問題:入力に同数は存在しないが、出力の対数は一意ではない
整数配列
コードは以下の通りである:時間複雑度O(n),空間複雑度O(n)
③、入力整数が重複している場合
整数配列
-』配列を並べ替えてから、必要に応じた整数を最初から後から探します.頭ポインタpBeginと尾ポインタpEndを使用して配列を巡回できます.
-』頭ポインタpBeginと尾ポインタpEndを使用して配列全体を直接頭から後ろへ遍歴する
1つ目の方法は配列を乱し、結果が元の配列と一致しない.2つ目の方法は暴力的な解であり,2つの方法の時間的複雑さはいずれもO(n^2)であり,2つ目の方法コードは以下の通りである:(もし大物がより良い方法があれば,評論区でお知らせしたい,ありがとうございます)
①、twosum入力は同じデータが存在せず、出力が一意である
質問の説明:整数配列
nums
とターゲット値target
を指定します.この配列で、ターゲット値としての2つの整数を見つけて、その配列の下に返してください.入力ごとに1つの答えしか対応しないと仮定できます.しかし、この配列の同じ要素を繰り返し利用することはできません.ソリューション:
1)、暴力的な解決方法を使用し、ネストされた遍歴を使用して、対応する要素の下付きを見つける
2)、ハッシュリストを使用します.具体的には以下の通りです.
まずmapコンテナrecordを設定し、要素の値とインデックスを記録し、配列を巡ります.
-』配列を巡回するたびに、一時変数complementを使用して、目標値と現在値との差を保存します.
-このループでrecordを検索し、complementと一致するかどうかを確認します.検索に成功した場合は、現在の検索値のインデックスと現在のループ値iを返します.
-が見つからない場合は、recordに要素値と下付きiを保存します.
コードは以下の通りである:時間複雑度O(n),空間複雑度O(n)
// ,
public int[] twosum(int[] nums, int target){
// (key) (value)
HashMap record = new HashMap<>();
//
int[] res = new int[2];
//
for (int i = 0; i
②、twosum問題:入力に同数は存在しないが、出力の対数は一意ではない
整数配列
nums
に複数対の整数を加算するとtargetが得られ、1の実現形態によれば、完全な配列を遍歴すればよい.コードは以下の通りである:時間複雑度O(n),空間複雑度O(n)
public ArrayList twosum_output_contain_duplication(int[] nums, int target){
//
ArrayList arrayList = new ArrayList<>();
//
HashMap hashMap = new HashMap<>();
for (int i = 0; i < nums.length ; i++) {
int t = target - nums[i];
if(hashMap.containsKey(t)){
//
int[] res = new int[2];
res[0] = i;
res[1] = hashMap.get(t);
//
arrayList.add(res);
}
hashMap.put(nums[i], i);
}
return arrayList;
}
③、入力整数が重複している場合
整数配列
nums
の複数対の整数を加算するとtargetが得られ、入力整数が同じ整数を加算するとtargetが得られるという2つの考え方がある.-』配列を並べ替えてから、必要に応じた整数を最初から後から探します.頭ポインタpBeginと尾ポインタpEndを使用して配列を巡回できます.
-』頭ポインタpBeginと尾ポインタpEndを使用して配列全体を直接頭から後ろへ遍歴する
1つ目の方法は配列を乱し、結果が元の配列と一致しない.2つ目の方法は暴力的な解であり,2つの方法の時間的複雑さはいずれもO(n^2)であり,2つ目の方法コードは以下の通りである:(もし大物がより良い方法があれば,評論区でお知らせしたい,ありがとうございます)
public ArrayList twosum_input_contain_duplication(int[] nums, int target){
//
ArrayList arrayList = new ArrayList<>();
// ,pBegin ,pEnd
int pOld = 0;
int pBegin = 0;
int pEnd = nums.length - 1;
//
while(pBegin < pEnd){
// pEnd
pOld = pEnd;
// pBegin,
while(pBegin < pEnd ){
// target
if(nums[pBegin] + nums[pEnd] == target){
int[] res = new int[2];
res[0] = pBegin;
res[1] = pEnd;
arrayList.add(res);
}
pEnd--;
}
pEnd = pOld;
pBegin++;
}
return arrayList;
}