Note:
Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
The solution set must not contain duplicate triplets.
For example, given array S = {-1 0 1 2 -1 -4},
A solution set is:
(-1, 0, 1)
(-1, -1, 2)
[分析] Two Sum的扩展版,排序输入数组,遍历数组求解。遍历 nums[k]时,找出下标 k 后面所有加和为 -nums[k]的pair,因为数组已排序,可使用两指针从两端往中间夹逼的技巧求解 two sum。注意到 k 只需遍历到相应数组元素为0时即可停止,因为三个正数的和不可能是0,另外遍历时需要跳过重复元素。
public class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> result = new ArrayList<List<Integer>>(); if (nums == null || nums.length < 3) return result; Arrays.sort(nums); int N = nums.length; for (int k = 0; k < N - 2 && nums[k] <= 0; k++) { if (k > 0 && nums[k] == nums[k - 1]) continue; int i = k + 1, j = N - 1; while ( i < j) { int sum2 = nums[i] + nums[j]; if (sum2 == -nums[k]) { List<Integer> item = new ArrayList<Integer>(); item.add(nums[k]); item.add(nums[i]); item.add(nums[j]); result.add(item); while (++i < j && nums[i] == nums[i - 1]); while (i <--j && nums[j] == nums[j + 1]); } else if (sum2 < -nums[k]) { while (++i < j && nums[i] == nums[i - 1]); } else { while (i <--j && nums[j] == nums[j + 1]); } } } return result; } }