1. 题目描述
https://leetcode.cn/problems/3sum/
2. 解题思路
2.1 双指针
- 对nums数组进行排序
- 通过指针i遍历0~n-2,固定a的值,并寻找b、c的值 使得a+b+c==0
- 通过j、k双指针查找b、c值,并满足j<k,a<=b<=c
- 若a+b+c>0,则右指针k–,若a+b+c<0,则做指针j++,若a+b+c==0则记录到结果列表中
- 同时,注意去重问题
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums); //排序
List<List<Integer>> res=new ArrayList<>(); //记录结果
for(int i=0;i<nums.length-2&& nums[i] <= 0;i++){
int a=nums[i]; //先确定a
if(i>0&&a==nums[i-1]) continue; //防止a重复
int j=i+1,k=nums.length-1; //通过双指针确定b和c
while(j<k){
int b=nums[j],c=nums[k];
if(a+b+c==0){ //满足条件、记录到结果集中
while(j<k&&nums[j]==b) j++; //结果集里已有(a,b,c) 对b去重
while(j<k&&nums[k]==c) k--; //对c去重
res.add(Arrays.asList(a, b, c));
} else if(a+b+c>0){
k--; //三数和>0,则需要减小k
} else {
j++; //三数和<0,则需要增加j
}
}
}
return res;
}
}