18. [双指针]四数之和
18. 四数之和
下面是可稍作修改就应用于 15. 三数之和 的模板。
//执行耗时:28 ms,击败了18.19% 的Java用户
//内存消耗:38.9 MB,击败了91.90% 的Java用户
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
Arrays.sort(nums); // 排序
int n = nums.length;
List<List<Integer>> res = new ArrayList<List<Integer>>();
for (int a = 0; a < n - 3; a++){
// 防止a重复
if (a > 0 && nums[a] == nums[a - 1]){
continue;
}
for (int b = a + 1; b < n - 2; b++){
// 防止b重复
if (b > a + 1 && nums[b] == nums[b-1]){
continue;
}
int left = b + 1, right = n - 1;
while (left < right){
int sum = nums[a] + nums[b] + nums[left] + nums[right];
if (sum < target){
while (left < right && nums[left] == nums[++left]);
} else if (sum > target){
while (left < right && nums[right] == nums[--right]);
} else {
List<Integer> list = Arrays.stream(new int[] {nums[a],nums[b],nums[left],nums[right]}).boxed().collect(Collectors.toList());
res.add(list);
while (left < right && nums[left] == nums[++left]);
while (left < right && nums[right] == nums[--right]);
}
}
}
}
return res;
}
}

浙公网安备 33010602011771号