题目链接
思路
- 首先已知排序数组的两数之和可以用双指针来做
- 那么这道题我们可以先排序,然后按遍历数组,固定第一个数字,这样就转化为了“排序数组的两数之和”问题
- 主要需要注意去重的方法~ 在外部固定数字时需要,确定两数之和时也需要
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>(), tmpResult;
if (nums.length < 3)
return result;
Arrays.sort(nums);
int index = 0;
while (index < nums.length - 2) {
tmpResult = twoSum(nums, -nums[index], index + 1);
if (0 != tmpResult.size())
result.addAll(tmpResult);
while (index < nums.length - 2 && nums[index] == nums[++index]) ;
}
return result;
}
List<List<Integer>> twoSum(int[] nums, int target, int left) {
int right = nums.length - 1;
List<List<Integer>> result = new ArrayList<>();
while (left < right) {
if (nums[left] + nums[right] == target) {
result.add(List.of(nums[left], nums[right], -target));
while (nums[left] == nums[++left] && left < right) ;
while (nums[right] == nums[--right] && left < right) ;
} else if (nums[left] + nums[right] > target)
right--;
else
left++;
}
return result;
}
}