题目
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.
Note:
- Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
- The solution set must not contain duplicate quadruplets.
For example, given array S = {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的类似。先排序,然后固定2个位置,然后对剩下的2个一个个匹配。其中要注意的点就是可以直接跳过附近重复的元素,以此来得到独一无二的结果。
但是这个是n^3的..我本来以为AC不了,结果A了....
请大神指教更好的方法!
代码
public class Solution {
public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
Arrays.sort(num);
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(num.length==4&&num[0]+num[1]+num[2]+num[3]==target)
{
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(num[0]);
temp.add(num[1]);
temp.add(num[2]);
temp.add(num[3]);
result.add(temp);
return result;
}
for( int a = 0 ; a <=num.length-4; a++)
{
if(a!=0&&num[a]==num[a-1])
{
continue;
}
for(int b = a+1; b<=num.length-3;b++)
{
if(b-1>a&&num[b]==num[b-1])
{
continue;
}
int c = b+1;
int d = num.length-1;
while(c<d)
{
if(num[a]+num[b]+num[c]+num[d]==target)
{
ArrayList<Integer> temp = new ArrayList<Integer>();
temp.add(num[a]);
temp.add(num[b]);
temp.add(num[c]);
temp.add(num[d]);
result.add(temp);
c++;
d--;
while(c<d && num[c]==num[c-1])
{
c++;
}
while(c<d && num[d]==num[d+1])
{
d--;
}
}
else if(num[a]+num[b]+num[c]+num[d]<target)
{
c++;
}
else
{
d--;
}
}
}
}
return result;
}
}