时间复杂度必须小于O(n^3)
把数组按大小排序,一次性查找两边,往中间遍历
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
List<List<Integer>> lis = new ArrayList<>();
for(int i = 0;i<n-2;i++){
if(i==0||(i>0&&nums[i]!=nums[i-1]&&nums[i]<=0)){
int j =i+1,k=n-1,sum = 0-nums[i];
while(j<k){
if(nums[j]+nums[k]==sum){
lis.add(Arrays.asList(nums[i],nums[j],nums[k]));
while(j<k&&nums[j]==nums[j+1]) j++;
while(j<k&&nums[k]==nums[k-1]) k--;
j++;
k--;
}else if(nums[j]+nums[k]>sum){
while(j>=k&&nums[k]==nums[k-1]) k--;
k--;
}else{
while(j>=k&&nums[j]==nums[j+1]) j++;
j++;
}
}
}
}
return lis;
}
}