Given an array nums of n integers and an integer target, are there elements abc, 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]
]

题目

思路

1. Sort the array (coz we need to check the duplicates)

2. Lock two pointer on left most side and do two sum with the other two in the remaing

代码

 class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> result = new ArrayList<>();
if (nums.length < 4) return result;
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 k = j + 1;
int l = nums.length - 1;
while (k < l) {
final int sum = nums[i] + nums[j] + nums[k] + nums[l];
if (sum < target) {
++k;
while(nums[k] == nums[k-1] && k < l) ++k;
} else if (sum > target) {
--l;
while(nums[l] == nums[l+1] && k < l) --l;
} else {
result.add(Arrays.asList(nums[i], nums[j], nums[k], nums[l]));
++k;
--l;
while(nums[k] == nums[k-1] && k < l) ++k;
while(nums[l] == nums[l+1] && k < l) --l;
}
}
}
}
return result;
}
}
04-29 01:28