原题链接: https://leetcode.com/problems/4sum/
n-Sum专题相关题目
1. Two Sum
15. 3Sum
16. 3Sum Closest
18. 4Sum
167. Two Sum II - Input array is sorted
560. Subarray Sum Equals K
653. Two Sum IV - Input is a BST
1. 题目描述
Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a + b + c + d = target
Find all unique quadruplets in the array which gives the sum of target.
Note:
The solution set must not contain duplicate quadruplets.
Example:
Given array nums = [1, 0, -1, 0, -2, 2], and target = 0.
A solution set is:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
2. 解题思路
和3 Sum类似,把求a+b+c+d = target 转化为给定a、b,二分求c+d = target-a-b 的问题。
代码
public class Solution {
List<List<Integer> > res = new ArrayList<List<Integer>>();
public List<List<Integer>> fourSum(int[] nums, int target) {
int length = nums.length;
Arrays.sort(nums);
for(int i = 0;i<length-3;i++) {
if(i>0 && nums[i-1] == nums[i])
continue;
for(int j =i+1;j<length-2;j++) {
if(j>i+1 && nums[j-1]==nums[j])
continue;
erfen(i,j,nums,target);
}
}
return res;
}
public void erfen(int a,int b, int[] nums,int target) {
int sum = target-nums[a]-nums[b];
int l = b+1;
int r = nums.length - 1;
while(l<r) {
if(nums[l] + nums[r] > sum) {
r--;
}
else if(nums[l] + nums[r] < sum) {
l++;
}
else {
List<Integer> temp = new ArrayList<Integer>(4);
temp.add(nums[a]);
temp.add(nums[b]);
temp.add(nums[l]);
temp.add(nums[r]);
res.add(temp);
while(l<r && nums[l] == nums[l+1])
l++;
while(l<r && nums[r] == nums[r-1])
r--;
r--;
l++;
}
}
}
}