双指针法
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
Arrays.sort(num);
for (int i = 0; i < num.length-2; i++) {
if(i!=0&&num[i]==num[i-1]){//加该判断的目的是防止结果中出现重复的三元组,注意逻辑与运算符只有前面为true,才判断后面是否为true,若前面为false,则直接返回false,不再判断
continue;
}
int left = i+1;
int right = num.length-1;
while (left<right){
int target = num[left]+num[right];
if(target>-num[i]){
right--;
}else if(target<-num[i]){
left++;
}else {
ArrayList<Integer> list = new ArrayList<>();
list.add(num[i]);
list.add(num[left]);
list.add(num[right]);
res.add(list);
//防止出现重复的三元组
while (num[left]==num[left+1]&&left+1<right){left++;}
while (num[right]==num[right-1]&&left<right-1){right--; }
left++;
right--;
}
}
}
return res;
}

京公网安备 11010502036488号