4 sum

Given an array S _of _n _integers, are there elements_a,b,c, andd_in_S_such that_a + b + c + d = target?

Find all unique quadruplets in the array which gives the sum of target.

Notice

Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie,a ≤ b ≤ c ≤ d)
The solution set must not contain duplicate quadruplets.

Example

Given array S ={1 0 -1 0 -2 2}, and target =0. A solution set is:

(-1, 0, 0, 1)
(-2, -1, 1, 2)
(-2, 0, 0, 2)

Solution: Two pointer. The same as 3sum. The point to learn is how to cut leaves(skip duplicate without hashset).
public ArrayList<ArrayList<Integer>> fourSum(int[] numbers, int target) {
    ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
    if(numbers == null || numbers.length == 0) {
        return res;
    }
    Arrays.sort(numbers);
    for(int i = 0; i < numbers.length; i++) {
        if(i > 0 && numbers[i] == numbers[i - 1]) {
            continue;
        }
        for(int j = i + 1; j < numbers.length; j++) {
            if(j > i + 1 && numbers[j] == numbers[j - 1]) {
                continue;
            }
            int left = j + 1, right = numbers.length - 1;
            while(left < right) {
                int sum = numbers[i] + numbers[j] + numbers[left] + numbers[right];
                if(sum == target) {
                    ArrayList<Integer> ans = new ArrayList<Integer>();
                    ans.add(numbers[i]);
                    ans.add(numbers[j]);
                    ans.add(numbers[left]);
                    ans.add(numbers[right]);
                    res.add(ans);
                    left++;
                    right--;
                    while(left <= right && numbers[left] == numbers[left - 1]) {
                        left++;
                    }
                    while(left <= right && numbers[right] == numbers[right + 1]) {
                        right--;
                    }
                }
                else if(sum < target) {
                    left++;
                }
                else {
                    right--;
                }
            }
        }
    }
    return res;
}

results matching ""

    No results matching ""