LeetCode Q 15 - 3Sum
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:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is: [[-1, 0, 1],[-1, -1, 2]]
Solution
Take care to boundary cases.
Code:
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if (nums == null || nums.length == 0) return res;
Arrays.sort(nums);
int len = nums.length;
for (int i = 0; i < len - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) continue; // skip duplicates
if (nums[i] + nums[i + 1] + nums[i + 2] > 0) break; // too large
if (nums[i] + nums[len - 1] + nums[len - 2] < 0) continue; // to small
int left = i + 1, right = len - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
res.add(Arrays.asList(nums[i], nums[left++], nums[right--]));
while (left < right && nums[left] == nums[left - 1]) left++;
while (left < right && nums[right] == nums[right + 1]) right--;
} else if (sum > 0) {
right--;
} else {
left++;
}
}
}
return res;
}