package amazon; // Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. // Note: 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] // ] import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Created by anduo on 17-3-13. */ public class ThreeSum { // 把3sum的问题,降级到2sum问题 public List> threeSum(int[] nums) { List> result = new ArrayList<>(); Arrays.sort(nums); for (int i = 0; i < nums.length; i++) { if (i > 0 && nums[i] == nums[i - 1]) {// 这道题用不到这个条件,因为题目说了不考虑重复元素 continue; } int left = i + 1; int right = nums.length - 1; int target = -nums[i]; twoSum(nums, left, right, target, result); } return result; } public void twoSum(int[] nums, int left, int right, int target, List> results) { // 充分利用有序这样一个特点 while (left < right) { if (nums[left] + nums[right] == target) { ArrayList triple = new ArrayList<>(); triple.add(-target); triple.add(nums[left]); triple.add(nums[right]); results.add(triple); left++; right--; // skip duplicate pairs with the same left while (left < right && nums[left] == nums[left - 1]) { left++; } // skip duplicate pairs with the same right while (left < right && nums[right] == nums[right + 1]) { right--; } } else if (nums[left] + nums[right] < target) { left++; } else { right--; } } } }