1.暴力
2.双指针
关键字:不可以包含重复
模式识别:利用排序避免重复答案
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;i++){
//如果遍历的起始元素大于0,就直接退出
//原因,此时数组为有序的数组,最小的数都大于0了,三数之和肯定大于0
if(nums[i]>0){
break;
}
if(i>=1&&nums[i-1]==nums[i]) continue;
int left=i+1;
int right=nums.length-1;
//外面需要套一层大循环(即使找到正确解也可能还有别的解所以要一直找下去)
while(left<right){
if(nums[right]+nums[left]+nums[i]==0){
res.add(Arrays.asList(nums[i], nums[left], nums[right]));
//把结果添加之后去重
while(left<right&&nums[right]==nums[right-1]){
right--;
}
while(left<right&&nums[left]==nums[left+1]){
left++;
}
//去重后将指针移动到正确位置
right--;
left++;
}else if(nums[right]+nums[left]+nums[i]>0) right--;
else if(nums[right]+nums[left]+nums[i]<0) left++;
}
}
return res;
}
}