LeetCode 18题 -> 四数之和
1. 题目描述
-
给定一个包含 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] ]
2. 解题思路
- 排序 + 双指针 + 循环
- 与三数之和思路类似;
- 多加一个循环确定两个值nums[i] 和nums[j];
- 双指针left = j + 1; right = nums.length - 1
3. 代码实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class FourSum {
public static List<List<Integer>> fourSum(int[] nums, int target){
List<List<Integer>> ans = new ArrayList<>();
Arrays.sort(nums);
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 left = j + 1;
int right = nums.length - 1;
while(left < right){
int sum = nums[i] + nums[j] + nums[left] + nums[right];
if(sum == target){
ans.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
while(left < right && nums[left] == nums[left+1]){
left ++;
}
while(left < right && nums[right] == nums[right-1]){
right--;
}
left++;
right--;
}else if(sum > target){
right--;
}else{
left++;
}
}
}
}
return ans;
}
public static void main(String[] args) {
int[] nums = {1, 0, -1, 0, -2, 2};
System.out.println(fourSum(nums, 0));
}
}