18. 四数之和
给定一个包含 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]
]
思路:首先,进行数据排序,四个数(i,j,l,r),先遍历i,j的值(不重复),再首位检查l,r是否符合要求,从j后面开始算起。如果给的数组的长度少于4直接返回空list表.还要注意一点:查重,避免出现重复数据
java的code:
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
List<Integer> list2 = null;
if(nums.length <4) {
return list;
}
Arrays.sort(nums);
int temp = 0;
int l = 0;
int r = 0;
int sum = 0;
int arr[] = new int[4];
for(int i = 0; i < nums.length - 3;i++) {
for(int j = i+1; j < nums.length - 2; j++ ){
l = j + 1;
r = nums.length - 1;
temp = nums[i] + nums[j];
while(l < r) {
sum = temp + nums[l] + nums[r];
if(sum < target){
l++;
}else if(sum > target) {
r--;
}else if(sum == target ){
arr[0] = nums[i];
arr[1] = nums[j];
arr[2] = nums[l];
arr[3] = nums[r];
// System.out.println(i+" " + j + " " +l + " " + r + "######## " + nums[i] +" " + nums[j] + " " + nums[l] + " " + nums[r]);
Arrays.sort(arr);
list2 = new ArrayList<Integer>();
list2.add(arr[0]);
list2.add(arr[1]);
list2.add(arr[2]);
list2.add(arr[3]);
if(!list.contains(list2)&& l != i && l != j && r != i && r != j) {
list.add(list2);
}
while(l < r && nums[l] == nums[l+1]){
l++;
}
while(l < r && nums[r] == nums[r-1]){
r--;
}
l++;
r--;
}
}
}
}
return list;
}
}