4Sum

Problem: 4Sum

The solution is similar to 3 Sum problem. We need to use some methods to implement early return. Besides, we shall also avoid duplicate answers.

Code in Python:

class Solution(object):
    def fourSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        nums = sorted(nums)
        n = len(nums)
        ans = []
        for i in xrange(n-3):
            if nums[i] + nums[i+1] + nums[i+2] + nums[i+3] > target:
                break
            if i > 0 and nums[i] == nums[i-1]:
                continue
            for j in xrange(i+1, n-2):
                if j > i+1 and nums[j] == nums[j-1]:
                    continue
                l, r = j+1, n-1
                while l < r:
                    sum = nums[i]+nums[j]+nums[l]+nums[r]
                    if sum == target:
                        ans.append([nums[i], nums[j], nums[l], nums[r]])
                        l += 1
                        r -= 1
                        while l < r and nums[l] == nums[l-1]: l += 1
                        while r > l and nums[r] == nums[r+1]: r -= 1
                    elif sum < target:
                        l += 1
                        while l < r and nums[l] == nums[l-1]: l += 1
                    else:
                        r -= 1
                        while r > l and nums[r] == nums[r+1]: r -= 1
        return ans

Code in Java:

public class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();

        if (nums.length < 4) return res;

        Arrays.sort(nums);

        for (int i = 0; i < nums.length-3; i++) {
            if (i > 0 && nums[i] == nums[i-1])
                continue;
            for (int j = i+1; j < nums.length-2; j++) {
                if (j > i+1 && nums[j] == nums[j-1])
                    continue;
                int l = j+1, r = nums.length-1;
                while (l < r) {
                    if (nums[i]+nums[j]+nums[l]+nums[r] == target) {
                        List<Integer> quadruplet = new ArrayList<Integer>();
                        quadruplet.add(nums[i]);
                        quadruplet.add(nums[j]);
                        quadruplet.add(nums[l]);
                        quadruplet.add(nums[r]);
                        res.add(quadruplet);
                        while (l+1 < nums.length && nums[l+1] == nums[l])
                            l++;
                        l++;
                        while (r-1 >= 0 && nums[r-1] == nums[r])
                            r--;
                        r--;
                    } else if (nums[i]+nums[j]+nums[l]+nums[r] < target) {
                        while (l+1 < nums.length && nums[l+1] == nums[l])
                            l++;
                        l++;
                    } else {
                        while (r-1 >= 0 && nums[r-1] == nums[r])
                            r--;
                        r--;
                    }
                }
            }
        }

        return res;
    }
}

Also we can use some tricks to reduce running time, like the solution here.

results matching ""

    No results matching ""