アルゴリズムの質問: 配列とターゲット数値が与えられた場合、ターゲット値となる配列内の 2 つの数値の合計を見つけて、2 つの数値を出力します。時間計算量は O(N) です。

問題解決のアイデア:

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 番目のタイプの実行効率がはるかに高速です。

おすすめ

転載: blog.csdn.net/guliudeng/article/details/130722205