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 List<List<Integer>> fourSum(int[] num, int target) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if(num==null || num.length==0) {
return ret;
}
Arrays.sort(num);
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i=0;i<num.length;i++) {
map.put(num[i], i);
}
for(int i=0;i<num.length;i++) {
if(i!=0 && num[i]==num[i-1]) continue;
for(int j=i+1;j<num.length;j++) {
if(j!=i+1 && num[j]==num[j-1]) continue;
for(int m=j+1;m<num.length;m++) {
if(m!=j+1 && num[m]==num[m-1]) continue;
int n = target - num[i] - num[j] - num[m];
Integer idx = map.get(n);
if(idx!=null && idx.intValue() > m) {
List<Integer> tup = new ArrayList<Integer>();
tup.add(num[i]);
tup.add(num[j]);
tup.add(num[m]);
tup.add(n);
ret.add(tup);
}
}
}
}
return ret;
}
}
public class Solution {
public ArrayList<ArrayList<Integer>> fourSum(int[] num, int target) {
ArrayList<ArrayList<Integer>> ret = new ArrayList<ArrayList<Integer>>();
HashMap<Integer, ArrayList<int[]>> sum2 = new HashMap<Integer, ArrayList<int[]>>();
for(int i=0;i<num.length;i++) {
for(int j=i+1;j<num.length;j++) {
int sum = num[i] + num[j];
int[] idxes = new int[2];
idxes[0] = i;
idxes[1] = j;
ArrayList<int[]> idxx = sum2.get(sum);
if(idxx==null) {
idxx = new ArrayList<int[]>();
sum2.put(sum, idxx);
}
idxx.add(idxes);
}
}
HashSet<String> keys = new HashSet<String>();
for(Integer s1 : sum2.keySet()) {
ArrayList<int[]> idx2 = sum2.get(target-s1);
if(idx2!=null) {
ArrayList<int[]> idx1 = sum2.get(s1);
for(int[] i1 : idx1) {
for(int[] i2 : idx2) {
if(i1[0]!=i2[0] && i1[0]!=i2[1] && i1[1]!=i2[0] && i1[1]!=i2[1]) {
ArrayList<Integer> tuple = new ArrayList<Integer>();
tuple.add(num[i1[0]]);
tuple.add(num[i1[1]]);
tuple.add(num[i2[0]]);
tuple.add(num[i2[1]]);
Collections.sort(tuple);
String key = tuple.get(0) + "_" + tuple.get(1) + "_" + tuple.get(2) + "_" + tuple.get(3);
if(!keys.contains(key)) {
keys.add(key);
ret.add(tuple);
}
}
}
}
}
}
return ret;
}
}
==========
public class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if (nums == null || nums.length < 4) {
return res;
}
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
if (i != 0 && nums[i] == nums[i-1]) {
continue;
}
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == nums[j - 1] && j - 1 > i) {
continue;
}
int s = j + 1;
int e = nums.length - 1;
while (s < e) {
int n1 = nums[i];
int n2 = nums[j];
int n3 = nums[s];
int n4 = nums[e];
int sum = n1 + n2 + n3 + n4;
if (sum > target) {
e--;
} else if (sum < target) {
s++;
} else {
List<Integer> list = new ArrayList<Integer>();
list.add(n1);
list.add(n2);
list.add(n3);
list.add(n4);
res.add(list);
while (s < e && nums[s] == nums[s + 1]) {
s++;
}
while (s < e && nums[e] == nums[e - 1]) {
e--;
}
e--;
s++;
}
}
}
}
return res;
}
}
没有评论:
发表评论