3Sum

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;
}

   Reprint policy


《3Sum》 by Tong Shi is licensed under a Creative Commons Attribution 4.0 International License
  TOC