class Solution {
public List<List<Integer>> threeSum(int[] nums) {
if(nums.length<3){
return new ArrayList<>();
}
//排序
Arrays.sort(nums);
Set<List<Integer>> ans=new HashSet<>();
for(int i=0;i<nums.length;i++){
int target=-nums[i];
//转换为和为-nums[i]
int left=0;
int right=nums.length-1;
while(left<right){
if(nums[left]+nums[right]>target){
right--;
}else if(nums[left]+nums[right]<target){
left++;
}else{
List<Integer> ele=new ArrayList<>();
ele.add(nums[i]);
ele.add(nums[left]);
ele.add(nums[right]);
ans.add(ele);
right--;
left++;
}
}
}
return new ArrayList(ans);
}
}
并未去重。
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
//这题采用双指针
//首先先进行排序
Arrays.sort(nums);
//定义一个结果集合
List<List<Integer>> res = new ArrayList<List<Integer>>();
//这里的nums.length-2是为了保证最后还有两个数
for(int k = 0; k < nums.length - 2; k++){
//如果nums[k]>0的话那后面的值一定不会等于0,因为已经提前排好序了
if(nums[k] > 0) break;
//这里去重
if(k > 0 && nums[k] == nums[k - 1]) continue;
//定义双指针
int i = k + 1, j = nums.length - 1;
while(i < j){
//三数相加
int sum = nums[k] + nums[i] + nums[j];
if(sum < 0) {
//如果相加的和小于0,左指针前进并去重
while(i < j && nums[i] == nums[++i]);
}else if(sum > 0){
while(i < j && nums[j] == nums[--j]);
}else{
res.add(new ArrayList<Integer>(Arrays.asList(nums[k],nums[i],nums[j])));
while(i < j && nums[i] == nums[++i]);
while(i < j && nums[j] == nums[--j]);
}
}
}
return res;
}
}