Description
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.
Note: The solution set must not contain duplicate quadruplets.
For 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]
]
Solution
Four-pointers, O(n^3) time
先对数组进行排序,注意去重。跟3Sum的思路一样。
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> quadruplets = new ArrayList();
if (nums == null || nums.length < 4) return quadruplets;
Arrays.sort(nums);
int i = 0;
int n = nums.length;
while (i < n - 3) {
int j = i + 1;
while (j < n - 2) {
int k = j + 1;
int l = n - 1;
while (k < l) {
int sum = nums[i] + nums[j] + nums[k] + nums[l];
if (sum < target) {
++k;
} else if (sum > target) {
--l;
} else {
quadruplets.add(
Arrays.asList(nums[i], nums[j], nums[k], nums[l]));
while (++k < l && nums[k] == nums[k - 1]) {};
while (k < --l && nums[l] == nums[l + 1]) {};
}
}
while (++j < n - 2 && nums[j] == nums[j - 1]) {};
}
while (++i < n - 3 && nums[i] == nums[i - 1]) {};
}
return quadruplets;
}
}