四数之和
给你一个由 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
你可以按 任意顺序 返回答案 。
这道题的本质其实是和三数之和一样的,然而我本来想到了,但是因为一些小错误而导致错过了正确的解法,真是服了自己,其实思路就是排序加双指针,因为是四数之和,所以要比三数之和多加一个循环,固定前两个数,然后后两个数进行双指针遍历,下面是代码。`
List<List<Integer>> re = new ArrayList<>();
int l2,r2;
if(nums.length<4) return re;
Arrays.sort(nums);
for(int i=0;i< nums.length-3;++i){
// 由于nums[i]对应的元素值已经枚举过了,不需要再次枚举了
if(i>0&&nums[i]==nums[i-1]) continue;
for (int j=i+1;j<nums.length-2;++j){
// 由于nums[i]对应的元素值已经枚举过了,不需要再次枚举了
if(j>i+1&&nums[j]==nums[j-1]) continue;
l2=j+1;
r2=nums.length-1;
while (l2<r2){
int t2 = nums[i]+nums[j]+nums[l2]+nums[r2];
if(t2==target){
List<Integer> num = new ArrayList<>();
num.add(nums[i]);
num.add(nums[l2]);
num.add(nums[j]);
num.add(nums[r2]);
re.add(num);
//去重
l2++;
r2--;
while (l2<r2 && nums[l2] == nums[l2-1]) l2++;
while (l2<r2 && nums[r2] == nums[r2+1]) r2--;
}
else if (t2>target){
r2--;
}
else if (t2<target){
l2++;
}
}
}
}
return re;