题干
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/4sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
最简单也是最蠢的方法,遍历,使用Set集合去重。
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
HashSet<List<Integer>> set = new HashSet<List<Integer>>();
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> list = new ArrayList<Integer>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[k]);
list.add(nums[l]);
Collections.sort(list);
set.add(list);
}
}
}
}
}
return new ArrayList<List<Integer>>(set);
}
}
优化写法:加上最大值和最小值的判断,去重
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> ans = new ArrayList<>();
if(nums == null || nums.length<4)
return ans;
Arrays.sort(nums);
int len = nums.length;
/*定义4个指针k,i,j,h k从0开始遍历,i从k+1开始遍历,留下j和h,j指向i+1,h指向数组最大值*/
for(int k=0;k<len-3;k++) {
// 去重
if(k>0&&nums[k]==nums[k-1])
continue;
// 当前可能的最小值
int min1 = nums[k] + nums[k+1] + nums[k+2]+nums[k+3];
if(min1 > target) break;
// 当前可能的最大值
int max1 = nums[k] + nums[len-3] + nums[len-2] + nums[len -1];
if(max1 < target) continue;
// 第二重循环
for(int i = k+1; i<len-2;i++) {
// 去重
if(i>k+1 && nums[i] == nums[i-1]) continue;
// 当前可能的最小值
int min2 = nums[k] + nums[i] + nums[i+1] + nums[i+2];
if(min2 > target) continue;
// 当前可能的最大值
int max2 = nums[k] + nums[i] + nums[len-2] + nums[len-1];
if(max2 < target) continue;
int j = i+1,h=len-1;
while(j<h) {
int sum = nums[k] + nums[i] + nums[j] + nums[h];
if( sum == target) {
ans.add(Arrays.asList(nums[k],nums[i],nums[j],nums[h]));
// 重复的不算
while(j<h&&nums[j]==nums[j+1]) j++;
while(j<h&&nums[h]==nums[h-1]) h--;
j++;
h--;
}
else if(sum < target) j++;
else h--;
}
}
}
return ans;
}
}