简单易懂, 不喜欢写文字解题了, 说一下大致思路
- 要先会2数之和
- 其中的几个while条件是用来跳循环的
import java.util.ArrayList; import java.util.Arrays; public class Solution { public ArrayList<ArrayList<Integer>> threeSum(int[] num) { ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>(); if (num.length == 0) { return arr; } Arrays.sort(num); for (int i = 0; i < num.length; i++) { ArrayList<ArrayList<Integer>> result = twoSum(num,i +1 , 0 - num[i]); if (result.size() > 0) { for (ArrayList<Integer> integers : result) { arr.add(new ArrayList<>(Arrays.asList( num[i] ,integers.get(0), integers.get(1)))); } } while (i < num.length -1 && num[i] == num[i + 1]) { i++; } } return arr; } public ArrayList<ArrayList<Integer>> twoSum(int[] num,int i , int target) { int left = i, right = num.length -1; ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>(); while (left < right) { ArrayList<Integer> temp = new ArrayList<>(); int result = target - (num[left] + num[right]); int leftValue = num[left]; int rightValue = num[right]; if (result == 0) { temp.add(leftValue); temp.add(rightValue); arr.add(temp); while (left < right && leftValue == num[left] ){ left++; } while (left < right && rightValue == num[right]){ right--; } } else if (result < 0) { while (left < right && rightValue == num[right]){ right--; } } else if(result > 0) { while (left < right && leftValue == num[left] ){ left++; } } } return arr; } }