一般的なハッシュ・テーブルの操作-TwoSumの問題


TwoSumの質問:
①、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;
    }