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)
翻译:
Code:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
/**
* @author MohnSnow
* @time 2015年6月4日 下午5:48:15
*
*/
public class LeetCode18 {
/**
* @param argsmengdx
* -fnst
*/
//460msA---只是前面3SUM的翻版
public static List<List<Integer>> fourSum(int[] nums, int target) {
int len = nums.length;
List<List<Integer>> list = new ArrayList<List<Integer>>();
HashSet<List<Integer>> set = new HashSet<List<Integer>>();
Arrays.sort(nums);
//System.out.println(Arrays.toString(nums));
for (int i = 0; i < len - 3; i++) {
for (int j = i + 1; j < len - 2; j++) {
for (int m = j + 1, n = len - 1; m < n;) {
//System.out.println("111111111");
if (nums[i] + nums[j] + nums[m] + nums[n] == target) {
//System.out.println("22222");
List<Integer> aList = new ArrayList<Integer>();
aList.add(nums[i]);
aList.add(nums[j]);
aList.add(nums[m]);
aList.add(nums[n]);
if (set.add(aList))
list.add(aList);
m++;
n--;
} else if (nums[i] + nums[j] + nums[m] + nums[n] - target < 0) {
//System.out.println("33333");
m++;
} else {
//System.out.println("444444");
n--;
}
}
}
}
return list;
}
public static void main(String[] args) {
int[] strs2 = { 5, 5, 3, 5, 1, -5, 1, -2 };
int a = 4;
System.out.println(fourSum(strs2, a));
}
}