LeetCode-in-Ruby.github.io

15. 3Sum

Medium

Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.

Notice that the solution set must not contain duplicate triplets.

Example 1:

Input: nums = [-1,0,1,2,-1,-4]

Output: [[-1,-1,2],[-1,0,1]]

Example 2:

Input: nums = []

Output: []

Example 3:

Input: nums = [0]

Output: []

Constraints:

Solution

# @param {Integer[]} nums
# @return {Integer[][]}
def three_sum(nums)
  nums = nums.sort
  rs = []
  nums.each.with_index do |num, i|
    if i > 0 && num == nums[i - 1]
      next
    end
    l, r = i + 1, nums.size - 1

    while l < r
      sum = num + nums[l] + nums[r]
      if sum > 0
        r -= 1
      elsif sum < 0
        l += 1
      else
        rs << [num, nums[l], nums[r]]
        l += 1
        while nums[l] == nums[l - 1] && l < r
          l += 1
        end
      end
    end
  end

  rs
end