4 sum

2018-05-28  本文已影响0人  sherrysack

4 sum

Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

The solution set must not contain duplicate quadruplets.

Example:

Given array nums = [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]
]

Thoughts:

Using the same idea used in 3 sum, and I transferred from the 3sum version.

The idea is to make sure each number would not repeat itself in the next for loop.

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> lst = new ArrayList<>();
        Arrays.sort(nums);
        for(int j = 0; j < nums.length-2; j++) {
            if(j == 0 || (nums[j] != nums[j-1])) {
                for(int i = j+1; i< nums.length-1; i++) {
                    if(i == j+1 ||(nums[i] != nums[i-1])) {
                        int lo = i+1, hi = nums.length-1, sum = target-nums[i]-nums[j];
                        while(lo < hi) {
                            if(nums[lo]+nums[hi] == sum) {
                                lst.add(Arrays.asList(nums[j], nums[i], nums[lo], nums[hi]));
                                while(lo < hi && nums[lo] == nums[lo+1]) lo++;
                                while(hi > lo && nums[hi] == nums[hi-1]) hi--;
                                lo++; hi--;
                            }
                            else if(nums[lo]+nums[hi] < sum) {
                                lo++;
                            }else {
                                hi--;
                            }
                        }
                    }
                }
            }

        }
        return lst;
            
    }
}
上一篇下一篇

猜你喜欢

热点阅读