問題解決のアイデア:
1 つ目はループ トラバーサルです。各要素を次の要素に追加し、ターゲット値と比較してから出力します。ループの最初の層は現在比較されている要素を制御し、ループの 2 番目の層は現在の比較の数を制御します。ここでは double for ループが使用されており、時間計算量は O(n^2) であり、要件を満たしていません。コード例は次のとおりです。
public static void main(String[] args) {
int data[] = {2,7,9,10,12,15};
int target = 14;
//第一反应,循环遍历,一个一个相加进行比较
for(int i=0;i<data.length;i++) {
//每一个数需要比较几次
for (int j=1+i;j<data.length;j++) {
int total = data[i] + data[j];
if (total == target) {
System.out.println("目标数:"+target+",Num1="+data[i]+",Num2="+data[j]);
}
}
}
}
2 つ目は、for ループのレイヤーの代わりに Map を使用して配列要素を走査し、map.containsKey メソッドを使用してコレクションにターゲット値 (現在の要素の値) があるかどうかを判断することです。 , 要素をキーとして使用し、要素に対応する配列添字をマップ内の値として保存します。存在する場合は、見つかって出力されることを意味します。今回の複雑さは要件を満たすために O(n) ですコードは次のとおりです
public static void main(String[] args) {
int data[] = {2,7,9,10,12,15};
int target = 14;
//第二种,使用map结构代替一层for循环
Map<Integer,Integer> map = new HashMap<>();
for(int i=0;i<data.length;i++) {
//使用map来判断,判断map中是否含有
if (map.containsKey(target-data[i])) {
Integer integer1 = map.get(target - data[i]);
System.out.println("目标数:"+target+",Num1="+data[integer1]+",Num2="+data[i]);
break;
}
//没有就将值作为key,下标作为value放在map中
map.put(data[i],i);
}
}
注: 将来、要素を見つけるためにトラバースするために二重の for ループを使用する状況が発生した場合は、時間の複雑さを軽減するために、map を使用して 1 つのレイヤーを置き換えることができるかどうかを検討できます。プロテストの結果: 1 番目のタイプの実行時間は 40 ~ 88 ミリ秒、2 番目のタイプの実行時間は 1 ~ 5 ミリ秒で、明らかに 2 番目のタイプの実行効率がはるかに高速です。