因为要保证每一个三元组的数字都不同,所以枚举三元组中的最小值。记三元组为【a,b,c】,最小值为a,最大值为c;
将数组排序,枚举每一个最小值,用双指针在其后面找到不同的b和c,因为bc不能重叠所以比较容易
不能枚举b,因为a和b有可能值相等,当出现相同的数时,无法保证b的左侧一定有与其值相等的a
import java.util.*;
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
HashMap<Integer,Integer> cnt = new HashMap<Integer,Integer>();
Arrays.sort(nums);
for(int i=0;i<nums.length-2;i++)
{
if(i>0 && nums[i]==nums[i-1])
continue;
int a = i+1;
int b = nums.length-1;
while(a<b){
if(nums[i] + nums[a] + nums[b] == 0)
{
ArrayList<Integer> tem = new ArrayList<Integer>();
tem.add(nums[i]);
tem.add(nums[a]);
tem.add(nums[b]);
ans.add(tem);
while(a<b && nums[a]==nums[a+1])a++;
while(b<nums.length-1 && nums[b]==nums[b+1])b--;
a++;
b--;
}
else if(nums[i] + nums[a] + nums[b] < 0)
a++;
else b--;
}
}
return ans;
}
}