给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] :
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。
示例 1:
输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
示例 2:
输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]
解题思路:
解法一:暴力解法遍历所有可能性,插入列表
public class Soultion {
public static List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> li = new ArrayList<>();
for (int i = 0;i<nums.length;i++){
for (int j = i+1;j<nums.length;j++){
for (int k = j+1;k<nums.length;k++){
for (int l = k+1;l<nums.length;l++){
if (nums[i]+nums[j]+nums[k]+nums[l] == target){
List<Integer> ans = new ArrayList<>();
ans.add(nums[i]);
ans.add(nums[j]);
ans.add(nums[k]);
ans.add(nums[l]);
Collections.sort(ans);
if (!li.contains(ans)){
li.add(ans);
}
}
}
}
}
}
return li;
}
}
解法二:排序+双指针
public class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> li =new ArrayList<List<Integer>>();
Arrays.sort(nums);
if (nums.length<4 || (target>=0 && nums[0] >target) || (target<=0 && nums[0]>0)) return li;
for (int i =0;i<nums.length-3;i++){
if (i>0 && nums[i] == nums[i-1])
continue;
for (int j = i+1;j<nums.length-2;j++){
if (j>i+1 && nums[j] == nums[j-1])
continue;
int p =j+1,q= nums.length-1;
while (p<q){
int val = nums[p]+nums[j]+nums[q];
if (val+nums[i] == target){
List<Integer> sets = new ArrayList<Integer>();
sets.add(nums[p]);
sets.add(nums[j]);
sets.add(nums[q]);
sets.add(nums[i]);
li.add(sets);
while (p<q && nums[p] == nums[p+1]) p++;
while (p>q && nums[q] == nums[q-1]) q--;
p++;q--;
}
else if (val +nums[i] < target) p++;
else q--;
}
}
}
return li;
}
}