https://leetcode-cn.com/problems/3sum/
先将给定数组排序,方便后续操作O(log n)
遍历数组取出当前数据num[i](注意一些剪枝的判断:>0舍去,去重),再取num[k]即num[i+1],再取num[j]即num[nums.length-1]
以这三数相加的和sum 与0比较来移动k和j指针 符合添加则加入ans
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> ans = new ArrayList<List<Integer>>();
for(int i = 0;i<nums.length-2;i++){
if(nums[i]>0){
break;
}
if(i>0&&nums[i-1]==nums[i]){
continue;
}
int k = i+1;
int j = nums.length-1;
while(k<j){
int sum = nums[i]+nums[k]+nums[j];
if(sum>0){
j--;
continue;
}
else if(sum<0){
k++;
continue;
}
else if(sum==0){
ans.add(Arrays.asList(nums[i],nums[k],nums[j]));
while(k+1<=nums.length-1&&nums[k]==nums[k+1]){
k++;
}
k++;
while(j-1>=0&&nums[j]==nums[j-1]){
j--;
}
j--;
}
}
}
return ans;
}
}