题目:
思路:将数组进行排序,遍历一个数作为中间数,选取中间数两边的数字,组成三元组,假如三元组大于0,则右侧内移一位,反之左侧内移一位,等于0时返回三元组,循环继续。
错误一:
问题分析:遍历中间数时没有设置去重条件,所以导致返回结果有重复值;
代码:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
//三数之和
Arrays.sort(nums);//数组排序
List<List<Integer>> ls=new ArrayList<>();
//从第0位开始遍历数组
for(int i=0;i<nums.length-2;i++) {
int l = i + 1;
int r = nums.length - 1;
if(i==0||i>0 && nums[i]!=nums[i-1]){
while (l < r) {
if (nums[i] + nums[l] + nums[r] == 0) {
ls.add(Arrays.asList(nums[i],nums[l],nums[r]));
while (l < r && nums[l] == nums[l + 1]) l++;//去除重复值
while (l < r && nums[r] == nums[r - 1]) r--;
l++;
r--;
}else if(nums[i] + nums[l] + nums[r] > 0){
while(l<r&&nums[r]==nums[r-1]) r--;
r--;
}else {
while(l<r&&nums[l]==nums[l+1]) l++;
l++;
}
}
}
}
return ls;
}
}