給定一個包含 n 個整數(shù)的數(shù)組 nums 和一個目標值 target世杀,判斷 nums 中是否存在四個元素 a穆律,b捉撮,c 和 d ,使得 a + b + c + d 的值與 target 相等峡钓?找出所有滿足條件且不重復(fù)的四元組。
注意:
答案中不可以包含重復(fù)的四元組若河。示例:
給定數(shù)組 nums = [1, 0, -1, 0, -2, 2]能岩,和 target = 0。
滿足要求的四元組集合為:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
思路:這種幾數(shù)之和的感覺思路都差不多萧福,固定某些值拉鹃,將實際操作轉(zhuǎn)化為雙指針,三數(shù)之和是固定一個數(shù)鲫忍,這邊就是固定兩個數(shù)膏燕。去重需要注意一下。在兩層循環(huán)中都要考慮到悟民,不然就會漏值或者少去重坝辫。
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
Arrays.sort(nums);
if(nums.length<4){
//沒有符合要求的四個數(shù)
return ans;
}
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;j++){
if(j>i+1&&nums[j]==nums[j-1]){
continue;
}
int l = j+1;
int r = nums.length-1;
while(l<r){
int sum = nums[i]+nums[j]+nums[l]+nums[r];
if(r<nums.length-1&&nums[r]==nums[r+1]||sum>target){
r--;
}else
if(l>j+1&&nums[l]==nums[l-1]||sum<target){
l++;
}else {
List<Integer> temp = new ArrayList<Integer>();
temp.add(nums[i]);
temp.add(nums[j]);
temp.add(nums[l++]);
temp.add(nums[r--]);
ans.add(temp);
}
}
}
}
return ans;
}
}