Home

15. 3Sum

Detailed explanation coming soon!

// sort nums
// if first num is positive, return empty solution set
// only need to lock 1
// as 2 increases, 3 must decrease since (1,2,3) is in numerical order

class Solution {
  public List<List<Integer>> threeSum(int[] nums) {
    ArrayList<List<Integer>> ret = new ArrayList<List<Integer>>();

    if (nums.length < 3) return ret;

    Arrays.sort(nums);

    for(int i = 0; i < nums.length - 2; i++) {

      if(nums[i] > 0) {
        // No more solutions can be found
        return ret;
      }

      if(i > 0 && nums[i-1] == nums[i]) continue; // Skip duplicates

      int j = i + 1;
      int k = nums.length - 1;

      while(j < k) {

        if(j > (i+1) && nums[j-1] == nums[j]) {
          j++; // Skip duplicates
          continue;
        }

        if(k < (nums.length - 1) && nums[k] == nums[k+1]) {
          k--; // Skip duplicates
          continue;
        }

        int sum = nums[i] + nums[j] + nums[k];

        if (sum > 0) {
          k--;
        } else if (sum < 0) {
          j++;
        } else {
          ret.add(Arrays.asList(nums[i], nums[j], nums[k]));
          j++;
          k--;
        }
      }
    }

    return ret;
  }
}


Questions? Have a neat solution? Comment below!