思路:
- 双指针思想
- 先给数组排序
- 然后固定一个数、再设left、right指针,nums[left] + nums[right] = -nums[a]
- 大于的话right--,小于的话left++
- 每次处理完left、right之后需要判断去重
- i也需要判断去重
- 代码
public List<List<Integer>> threeSum(int[] nums) {
//创建返回的数组
List<List<Integer>> list = new ArrayList<>();
//去重
Arrays.sort(nums);
//求数组长度
int n = nums.length;
//进入循环
for(int i = 0; i < n;){
//小优化
if(nums[i] > 0){
break;
}
int left = 1+i, right = n-1;
int target = -nums[i];
while(left < right){
//转换为两数之和
int sum = nums[left] + nums[right];
if(sum > target){
right--;
}else if(sum < target){
left++;
}else{
list.add(new ArrayList<Integer>(Arrays.asList(nums[left],nums[right],nums[i])));
//缩小区间,继续寻找
left++;
right--;
//对left去重
while(left < right && nums[left] == nums[left-1]){
left++;
}
//对right去重
while(left < right && nums[right] == nums[right+1]){
right--;
}
}
}
//对nums[i]去重
i++;
while(i < n && nums[i] == nums[i-1]){
i++;
}
}
return list;
}