首页 > 代码库 > [LeetCode]15 3Sum

[LeetCode]15 3Sum

https://oj.leetcode.com/problems/3sum/

public class Solution {
    public List<List<Integer>> threeSum(int[] num) {
        
        // Solution A
        // return threeSum_Sort(num);
        
        // Solution B
        return threeSum_Map(num);
    }
    
    ////////////////////
    // Solution A: Sort
    //
    // O(n^2)
    private List<List<Integer>> threeSum_Sort(int[] numbers)
    {
        Set<List<Integer>> toReturn = new HashSet<>();
        
        // Sort
        Arrays.sort(numbers);
        
        int len = numbers.length;
        for (int i = 0 ; i < len ; i ++)
        {
            // Fix i.
            // move index j from i -> len
            // index k from len to i;
            int j = i + 1;
            int k = len - 1;
            while (j < k)
            {
                int sum = numbers[i] + numbers[j] + numbers[k];
                if (sum == 0)
                {
                    List<Integer> r = new ArrayList<>();
                    r.add(numbers[i]);
                    r.add(numbers[j]);
                    r.add(numbers[k]);
                    toReturn.add(r);
                    j ++;
                    k --;
                }
                else if (sum > 0)
                {
                    k --;
                }
                else 
                {
                    j ++;
                }
            }
        }
        return new ArrayList<List<Integer>>(toReturn);
    }
    
    
    ////////////////////
    // Solution A: Map
    //
    // O(n^2)
    private List<List<Integer>> threeSum_Map(int[] num)
    {
        Set<List<Integer>> toReturn = new HashSet<>();
        
        Map<Integer, Integer> map = new HashMap<>();
        int len = num.length;
        for (int i = 0 ; i < len ; i ++)
        {
            map.put(num[i], i);
        }
        
        for (int i = 0 ; i < len ; i ++)
        {
            for (int j = i + 1 ; j < len ; j ++)
            {
                int sum = num[i] + num[j];
                
                Integer pos = map.get(-sum);
                if ((pos != null) && (pos != i && pos != j)) // A result found.
                {
                    List<Integer> r = new ArrayList<Integer>();
                    r.add(num[i]);
                    r.add(num[j]);
                    r.add(-sum);
                    Collections.sort(r);
                    toReturn.add(r);
                }
            }
        }
        return new ArrayList<List<Integer>>(toReturn);
    }
    

    ////////////////////
    // Solution A: Brute Force
    //    
    // Assume num.length >= 3
    private List<List<Integer>> threeSum_BruteForce(int[] num)
    {
        Set<List<Integer>> toReturn = new HashSet<>();
        int len = num.length;
        for (int i = 0 ; i < len ; i ++)
        {
            for (int j = i + 1 ; j < len ; j ++)
            {
                for (int k = j + 1 ; k < len ; k ++)
                {
                    if (num[i] + num[j] + num[k] == 0)
                    {
                        List<Integer> r = new ArrayList<Integer>(Arrays.asList(num[i], num[j], num[k]));
                        Collections.sort(r);
                        toReturn.add(r);
                    }
                }
            }
        }
        return new ArrayList<List<Integer>>(toReturn);
    }
}


[LeetCode]15 3Sum