四数之和. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/4sum/description/
在前面的两个题中,我们已经完成了两数之和和三数之和,到本题四数之和,其实也只是前几个题的延伸,在三数之和的基础上再固定一个数字。
先固定一个数字,剩下三个数按照三数之和的方式来完成。
对于三数之和,则是固定一个数,剩下的两个数再按照双指针的方式来求和。
和三数之和一样的问题,最难的部分在于去重的部分,我们从内向外依次去重:
- 两数之和,双指针往前(往后)遍历到一样的元素的时候,可以直接再往前(往后)移动一次,并且规定好范围,不要越界
- 三数之和和四数之和,固定的那个数往后遍历的时候,遇到重复的元素需要再次移动一次,防止循环重复
代码:
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> ret = new ArrayList<>();
Arrays.sort(nums);
int n = nums.length;
for(int i = 0 ; i < n - 2;){
for(int j = i + 1 ; j < n - 1;){
int left = j + 1;
int right = n - 1;
long aim = (long)target - nums[i] - nums[j];
while(left < right){
int sum = nums[left] + nums[right];
if(sum < aim){
left++;
}else if(sum > aim){
right--;
}else{
ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[j],nums[left],nums[right])));
left++;
right--;
while(left < right && nums[left - 1] == nums[left]){
left++;
}
while(left < right && nums[right + 1] == nums[right]){
right--;
}
}
}
j++;
while(j < n && nums[j - 1] == nums[j]){
j++;
}
}
i++;
while(i < n && nums[i - 1] == nums[i]){
i++;
}
}
return ret;
}
}