题目:三数之和 点击跳转
文章目录
题目描述
三数之和:固定一个数 → 剩下变成"两数之和"
排序 + 固定一个数 + 双指针 + 去重

题目解答
java
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
for(int i=0;i<nums.length-2;i++){
//优化
if (nums[i] > 0) {
break;
}
//nums.length-2
//去重1
if(i>0&&nums[i]==nums[i-1]){
continue;
}
int left = i+1;
int right = nums.length-1;
while(left<right){
int sum = nums[i] + nums[left] + nums[right];
if(sum == 0){
res.add(Arrays.asList(nums[i],nums[left],nums[right]));
//去重2
while(left<right && nums[left] == nums[left+1]){
left++;
}
//去重3
while(left<right && nums[right] == nums[right-1]){
right--;
}
//注意移动
left++;
right--;
}else if(sum<0){
left++;
}else{
right--;
}
}
}
return res;
}
}
1 排序
java
Arrays.sort(nums);
为双指针提供条件
数组有序 → 可以通过 left++ / right-- 控制大小
为去重提供条件
重复元素会挨在一起
2 固定第一个数i
java
for(int i=0;i<nums.length-2;i++)
枚举第一个数
java
nums[left] + nums[right] = -nums[i]
3 双指针
java
int left = i+1;
int right = nums.length-1;
if(sum == 0) → 找到答案
if(sum < 0) → left++
if(sum > 0) → right--

4 去重
去重1:i去重
java
if(i>0&&nums[i]==nums[i-1]){
continue;
}
去重2:left去重
java
while(left<right && nums[left] == nums[left+1]){
left++;
}
去重3:right去重
java
while(left<right && nums[right] == nums[right-1]){
right--;
}
5 剪枝优化
java
if (nums[i] > 0) {
break;
}
nums[i] > 0
→ 后面所有数都 ≥ nums[i] > 0
→ 三个正数不可能等于 0
所以可以直接结束循环