// 15. 3sum
Explore on LeetCode
15_3sum.rb
# frozen_string_literal: true
# @param {Integer[]} nums# @return {Integer[][]}def three_sum(nums) nums.sort!
results = []
nums.each.with_index do |sum, index| next if index.positive? && sum == nums[index - 1]
p1 = index + 1 p2 = nums.length - 1 target = 0 - sum last_found_p1 = nil
while p1 < p2 total = nums[p1] + nums[p2]
p1 += 1 if total < target p2 -= 1 if total > target
next unless target == total
results << [nums[index], nums[p1], nums[p2]] if nums[p1] != last_found_p1
last_found_p1 = nums[p1] p1 += 1 p2 = nums.length - 1 end end
resultsend
class Test15 < Minitest::Test def test_1 assert_equal three_sum([-1, 0, 1, 2, -1, -4]), [[-1, -1, 2], [-1, 0, 1]] end
def test_2 assert_equal three_sum([0, 1, 1]), [] end
def test_3 assert_equal three_sum([0, 0, 0]), [[0, 0, 0]] end
def test_4 assert_equal three_sum([0, 0, 0, 0]), [[0, 0, 0]] endend