Difficulty: Medium
Given an array nums
of n integers, are there elements a , b , c in nums
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.
Example:
1 2 3 4 5 6 7 Given array nums = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
Solution Language: Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 class Solution { public List<List<Integer>> threeSum(int [] nums) { List<List<Integer>> result = new ArrayList<>(); if (nums == null || nums.length == 0 ) { return result; } Arrays.sort(nums); for (int i = 0 ; i < nums.length && nums[i] <= 0 ; i++) { for (int j = i + 1 ; j < nums.length; j++) { int curSum = nums[i] + nums[j]; int index = Arrays.binarySearch(nums, j + 1 , nums.length, -curSum); if (index >= 0 ) { List<Integer> tmp = new ArrayList<>(); tmp.add(nums[i]); tmp.add(nums[j]); tmp.add(nums[index]); result.add(tmp); } while (j + 1 < nums.length && nums[j+1 ] == nums[j]) { j++; } } while (i + 1 < nums.length && nums[i+1 ] == nums[i]) { i++; } } return result; } }
两根指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 class Solution { public List<List<Integer>> threeSum(int [] nums) { List<List<Integer>> result = new ArrayList<>(); if (nums == null || nums.length == 0 ) { return result; } Arrays.sort(nums); int n = nums.length; int target = 0 ; for (int i = 0 ; i < n - 2 ; i++) { if (i > 0 && nums[i] == nums[i - 1 ]) { continue ; } int j = i + 1 ; int k = n - 1 ; while (j < k) { int res = nums[i] + nums[j] + nums[k]; if (res == 0 ) { result.add(Arrays.asList(nums[i], nums[j++], nums[k--])); while (j < k && nums[j] == nums[j - 1 ]) { j++; } while (j < k && nums[k] == nums[k + 1 ]) { k--; } } else if (res > 0 ) { k--; } else { j++; } } } return result; } }