4Sum
Problem
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target?
Find all unique quadruplets in the array which gives the sum of target.
Notice
Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
The solution set must not contain duplicate quadruplets.
Example
Given array S = {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)
Note
和3Sum方法一样,多一个数,故多一层循环。完全一致,不再赘述,
Solution
public class Solution {
public ArrayList<ArrayList<Integer>> fourSum(int[] A, int target) {
int n = A.length;
ArrayList<ArrayList<Integer>> res = new ArrayList();
Arrays.sort(A);
for (int i = 0; i < n-3; i++) {
if (i != 0 && A[i] == A[i-1]) continue;
for (int j = i+1; j <= n-3; j++) {
if (j != i+1 && A[j] == A[j-1]) continue;
int left = j+1, right = n-1;
while (left < right) {
int sum = A[i]+A[j]+A[left]+A[right];
if (sum == target) {
ArrayList<Integer> temp = new ArrayList();
temp.add(A[i]);
temp.add(A[j]);
temp.add(A[left]);
temp.add(A[right]);
res.add(temp);
left++;
right--;
while (left < right && A[left] == A[left-1]) left++;
while (left < right && A[right] == A[right+1]) right--;
}
else if (sum < target) left++;
else right--;
}
}
}
return res;
}
}
Update 2018-10
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);
int len = nums.length;
if (nums[0] * 4 > target || nums[len-1] * 4 < target) return res;
for (int i = 0; i < len-3; i++) {
if (i != 0 && nums[i] == nums[i-1]) continue;
for (int j = i+1; j < len-2; j++) {
if (j != i+1 && nums[j] == nums[j-1]) continue;
int left = j+1, right = len-1;
while (left < right) {
int sum = nums[i]+nums[j]+nums[left]+nums[right];
if (sum == target) {
List<Integer> temp = new ArrayList<>();
temp.addAll(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
res.add(temp);
left++;
right--;
while (left < right && nums[left] == nums[left-1]) left++;
while (left < right && nums[right] == nums[right+1]) right--;
} else if (sum < target) {
left++;
} else {
right--;
}
}
}
}
return res;
}
}
4Sum II
Problem
Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such that A[i] + B[j] + C[k] + D[l] is zero.
To make problem a bit easier, all A, B, C, D have same length of N where 0 ≤ N ≤ 500. All integers are in the range of -228 to 228 - 1 and the result is guaranteed to be at most 231 - 1.
Example:
Input:
A = [ 1, 2]
B = [-2,-1]
C = [-1, 2]
D = [ 0, 2]
Output:
2
Explanation:
The two tuples are:
- (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0
- (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0
Solution
class Solution {
public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
int len = A.length;
if (len == 0) return 0;
Map<Integer, Integer> map = new HashMap<>();
for (int a: A) {
for (int b: B) {
int sum = a+b;
map.put(sum, map.getOrDefault(sum, 0)+1);
}
}
int count = 0;
for (int c: C) {
for (int d: D) {
int sum = c+d;
if (map.containsKey(-sum)) count += map.get(-sum);
}
}
return count;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。