[LeetCode] 1. Two Sum


1. Two Sum



質問リンク:https://leetcode.com/problems/two-sum/
この文章を書いた理由は3Sum4Sumの問題を解くためだ.
この問題は配列問題であり、2つの要素の合計がtargetのインデックスであることを返します.

Solution


1. Brute Force

class Solution {
    public int[] twoSum(int[] nums, int target) {
        for(int i=0; i<nums.length-1; i++) {
            for(int j=i+1; j<nums.length; j++) {
                if(nums[i]+nums[j] == target) return new int[] {i, j};
            }
        }
        return new int[] {};
    }
}

最悪の場合,O(N^2)の時間的複雑さを持つ.説明は...省略

2. Two-pass Hash Table


ここからは3Sum4Sumの問題を解決するジャンプボードです.
HashMapを使用して、各要素とそのインデックスをHashMapに配置し、O(1)で補符号があるかどうかを検索します.(衝突が発生しない限り、HashMapで要素を検索してO(1);衝突が発生した場合、O(N))
  • 1反復)HashMapに<要素、index>を加えます.
  • の2回目の反復)HashMapで既存の要素の符号化(target-num)があるかどうかを探し、ある場合はそのインデックスで並べ替えて返します.
  • 注意事項map.get(complement)!=i同じ要素を繰り返し使用することはできません.検索した補語が自分であるかどうかを確認します.
    class Solution {
        public int[] twoSum(int[] nums, int target) {
            HashMap<Integer, Integer> map = new HashMap<>();
            for(int i=0; i<nums.length; i++) {
                map.put(nums[i], i);
            }
            for(int i=0; i<nums.length; i++) {
                int complement = target-nums[i];
                if(map.containsKey(complement) && map.get(complement)!=i) 
                    return new int[] {map.get(complement), i};
            }
            return new int[] {};
        }
    }

    3. One-pass Hash Table


    2番は改良された方法で、HashMapに<要素、index>を加え、O(1)で補語があるかどうかを検索します.合計1回の反復が必要であり,O(N)の時間的複雑さがある.
    class Solution {
        public int[] twoSum(int[] nums, int target) {
            HashMap<Integer, Integer> map = new HashMap<>();
            for(int i=0; i<nums.length; i++) {
                int complement = target-nums[i];
                if(map.containsKey(complement)) 
                    return new int[] {map.get(complement), i};
                map.put(nums[i], i);
            }
            return new int[] {};
        }
    }