一、问题描述
Given an array
S of
n integers, are there elements
a,
b,
c, and
d in
S such that
a +
b +
c +
d = target? Find all unique quadruplets in the array which gives the sum of target.
For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.
A solution set is:
A solution set is:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
二、解题思路
思路参考之前的
3SUM,定义四个位置变量,i指向位置0,j指向数组尾部,m和n位于两者之间。三层循环,算法复杂度为O(N^3)。
三、代码
public class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> result=new ArrayList<List<Integer>>();
if(nums==null || nums.length<4)
return result;
int temp=0;
Arrays.sort(nums);
for(int i=0;i<nums.length-3;i++){
int j=nums.length-1;
if(i>0 && nums[i]==nums[i-1]){
continue;
}
while(j-i>2){
if(j<nums.length-1 && nums[j]==nums[j+1]){
j--;
continue;
}
int m=i+1;
int n=j-1;
while(m<n){
temp=nums[i]+nums[m]+nums[n]+nums[j];
if(temp>target){
n--;
}
else if(temp==target){
result.add(Arrays.asList(new Integer[]{nums[i],nums[m],nums[n],nums[j]}));
while(m<n && nums[m]==nums[m+1]) m++;
while(m<n && nums[n]==nums[n-1]) n--;
m++;n--;
}
else{
m++;
}
}
j--;
}
}
return result;
}
}
本文一开始打算像控制内层的两个指针一样控制外层的两个指针,实际证明是不可以的,因为无法确定内层指针对应的两个数是最小值,这样移动是没有意义的。还有一个问题就是需要分别的消除四个指针位置值得重复。