LeetCode 18 四数之和
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
解题思路:
这个题的解题思路和之前的那个3数之和思路完全一样。不同的是这个题目是4个数,就是在原来3数的基础上预先处理2个数。代码几乎一样,具体见下面的代码:
class Solution{
public List<List<Integer>> fourSum(int[] nums, int target){
List<List<Integer>> res=new ArrayList<>();
//对数组进行排序
if(nums==null || nums.length<4) return res;
Arrays.sort(nums);
//处理边界条件
if(4*nums[0]>target) return res;
if(4*nums[nums.length-1]<target) return res;
for(int i=0;i<nums.length-3;i++){
for(int j=i+1;j<nums.length-2;j++){
int k=j+1;
int t=nums.length-1;
while(k<t){
if(nums[i]+nums[j]+nums[k]+nums[t]==target){
res.add(Arrays.asList(nums[i],nums[j],nums[k],nums[t]));
//下面的代码是去重用
while(i<nums.length-3 && nums[i]==nums[i+1]){
i++;
}
while(j<nums.length-2 && nums[j]==nums[j+1]){
j++;
}
while(k<t && nums[k]==nums[k+1]){
k++;
}
while(k<t && nums[t]==nums[t-1]){
t--;
}
k++;
t--;
} else if(nums[i]+nums[j]+nums[k]+nums[t]>target){
t--;
}
else{
k++;
}
}
}
}
return res;
}
}