.
题目链接
题目详情
算法原理
这道题的解题思路是:三个数:abc
先给数组进行排序,固定一个数c,然后再找出能够与c相加为0的a+b,即a+b=-c
而这里的a+b则需要用到两数之和来求解了
这里需要注意的几个点:
-
去重
相同的组合不能够同时存在
重复的a,b和c,需要进行跳过 -
不漏
当找到一个满足的时候,两个指针向中间移动,进行下一轮排查 -
简化
因为数组被排序优化了,那么当固定的c是正数的时候,后面的a+b肯定也是大于0的,也就是一定不会出现a+b=-c的情况.这种情况,直接break即可.
我的答案
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> lists = new ArrayList<>();
Arrays.sort(nums);
int n = nums.length;
for(int i = 0;i<=n-1;){
if(nums[i]>0) break;
int left = i+1,right = n-1,target = -nums[i];
while(left<right){
if(nums[left]+nums[right]>target){
right--;
}else if(nums[left]+nums[right]<target){
left++;
}else{
//存值
List<Integer> list = new ArrayList<>(Arrays.asList(nums[i],nums[left],nums[right]));
lists.add(list);
//去重
while(left<right&&nums[left+1]==nums[left]){
left++;
}
while(left<right&&nums[right-1]==nums[right]){
right--;
}
left++;
right--;
}
}
i++;
while(i<n&&nums[i]==nums[i-1]){
i++;
}
}
return lists;
}
}