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)
用两个循环 变为2sum问题 第二个循环的写法要注意
import java.util.ArrayList; import java.util.Arrays; public class Solution { private ArrayList<ArrayList<Integer>> list; public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) { list = new ArrayList<ArrayList<Integer>>(); Arrays.sort(num); for(int i=0;i<=num.length-4;i++) { if(i!=0 && num[i]==num[i-1]) continue; for(int j=i+1;j<=num.length-3;j++)//这里注意 { if(j!=i+1 && num[j]==num[j-1]) continue; find(j+1,num.length-1,i,j,target-num[j]-num[i],num); } } return list; } private void find(int start,int end,int i,int j,int result,int[] num) { while(start<end) { if(num[start]+num[end]>result) { end--; } else if(num[start]+num[end]<result) { start++; } else if(num[start]+num[end]==result) { ArrayList<Integer> tmpList = new ArrayList<Integer>(); tmpList.add(num[i]); tmpList.add(num[j]); tmpList.add(num[start]); tmpList.add(num[end]); list.add(tmpList); start++; end--; while(start<end && num[start]==num[start-1]) start++; while(start<end && num[end]==num[end+1]) end--; } } } }