四数之和. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 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;}
}