标签:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
//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)
public class Solution {
public static void main(String[] args) {
int[] a = {-1,2,2,-5,0,-1,4};
List<List<Integer>> result = fourSum(a,3);
for(int i = 0;i<result.size();i++){
System.out.println(result.get(i));
}
}
public static List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
HashSet<List<Integer>> contrast = new HashSet<List<Integer>>();
Arrays.sort(nums);
for(int i = 0;i<nums.length;i++){ //与3sum相似,先确定第一个元素
for(int j = i+1;j<nums.length;j++){ //确定第二个元素
int k = j+1; //后两个元素取之后总体元素的两端
int l = nums.length-1;
while(k<l){
int sum = nums[i]+nums[j]+nums[k]+nums[l];
if(sum>target){ //根据sum与target的比较确定l和k如何移动
l--;
}else if(sum<target){
k++;
}else if(sum == target){
List<Integer> temp = new ArrayList<Integer>();
temp.add(nums[i]);
temp.add(nums[j]);
temp.add(nums[k]);
temp.add(nums[l]);
if(!contrast.contains(temp)){ //查看result中是否存在
contrast.add(temp);
result.add(temp);
}
k++;
l--;
}
}
}
}
return result;
}
}
标签:
原文地址:http://blog.csdn.net/u011438605/article/details/51329300