题目描述
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.
样例
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] ]
思路分析
简单的来说,3sum在2sum的基础上增加了一重循环,同时增加了去重判断条件,而3sum也在4sum的基础上增加了一重循环(确保四数相加,即两重循环确定i j,夹逼确定low high),编写过程中,发现增加边界条件,可以提高不少运行时间,学习了。
代码
public List<List<Integer>> fourSum(int[] nums, int target) {
ArrayList<List<Integer>> list = new ArrayList<>();
if (nums.length<4) {
return list;
}
Arrays.sort(nums);
for (int i = 0; i < nums.length-3; i++) {
if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3] > target){
break;
}
if(nums[nums.length-1]+nums[nums.length-2]+nums[nums.length-3]+nums[i] < target){
continue;
}
if(i>0&&nums[i]==nums[i-1]){
continue;
}
for (int j = i+1; j < nums.length-2; j++) {
if (nums[i]+nums[j]+nums[j+1]+nums[j+2] > target) {
break;
}
if(nums[i]+nums[j]+nums[nums.length-1]+nums[nums.length-2] < target){
continue;
}
if(j>i+1 && nums[j]==nums[j-1]){
continue;
}
int low = j+1;
int high =nums.length-1;
while (low < high){
int sum = nums[i]+nums[j]+nums[low]+nums[high];
if (sum == target){
list.add(Arrays.asList(nums[i],nums[j],nums[low],nums[high]));
while(low<high && nums[low]==nums[low+1]){
low++;
}
while(low<high && nums[high]==nums[high-1]){
high--;
}
low++;
high--;
}
else if (sum < target){
low++;
}
else {
high--;
}
}
}
}
return list;
}
结果