18. 4Sum
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]
]
Solution
Idea: reduce it to 2sum case, but select a base element first. Be aware the duplicate case for selection the base element, duplicate consecutive base element shall not be checked again
if k == 2 -> 2Sum
else if k > 2, select a base element i first, and check the following elements which can make their (k-1) elements sum equal to target - nums[i], reduce the problem to k-1 sum, and so on.
T: O(n^3)
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> ret = new ArrayList<>();
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, l = nums.length-1;
while(k < l){
int sum = nums[i] + nums[j] + nums[k] + nums[l];
if(sum > target){
l--;
}else if (sum < target){
k++;
}else {
ret.add(Arrays.asList(new Integer[]{nums[i], nums[j], nums[k], nums[l]}));
k++;
l--;
while(k < l && nums[k] == nums[k-1]) k++;
while(k < l && nums[l] == nums[l+1]) l--;
}
}
}
}
return ret;
}
}
Last updated
Was this helpful?