Skip to content

Commit 31eb421

Browse files
committed
2024-07-03 v. 6.0.2: added "16. 3Sum Closest"
1 parent cc3fccd commit 31eb421

File tree

4 files changed

+60
-1
lines changed

4 files changed

+60
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,3 +467,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/).
467467
| 11. Container With Most Water | [Link](https://leetcode.com/problems/container-with-most-water/) | [Link](./lib/medium/11_container_with_most_water.rb) |
468468
| 12. Integer to Roman | [Link](https://leetcode.com/problems/integer-to-roman/) | [Link](./lib/medium/12_integer_to_roman.rb) |
469469
| 15. 3Sum | [Link](https://leetcode.com/problems/3sum/) | [Link](./lib/medium/15_3sum.rb) |
470+
| 16. 3Sum Closest | [Link](https://leetcode.com/problems/3sum-closest/) | [Link](./lib/medium/16_3sum_closest.rb) |

leetcode-ruby.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ require 'English'
55
::Gem::Specification.new do |s|
66
s.required_ruby_version = '>= 3.0'
77
s.name = 'leetcode-ruby'
8-
s.version = '6.0.1'
8+
s.version = '6.0.2'
99
s.license = 'MIT'
1010
s.files = ::Dir['lib/**/*.rb'] + %w[bin/leetcode-ruby README.md LICENSE]
1111
s.executable = 'leetcode-ruby'

lib/medium/16_3sum_closest.rb

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# frozen_string_literal: true
2+
3+
# https://leetcode.com/problems/3sum-closest/
4+
# @param {Integer[]} nums
5+
# @param {Integer} target
6+
# @return {Integer}
7+
def three_sum_closest(nums, target)
8+
n = nums.length
9+
10+
return nums[0] + nums[1] + nums[2] if n == 3
11+
12+
nums.sort!
13+
n = nums.length
14+
max = nums[n - 1] + nums[n - 2] + nums[n - 3]
15+
16+
return max if target > max
17+
18+
min = ::Float::INFINITY
19+
(0...(n - 2)).each do |i|
20+
l = i + 1
21+
r = n - 1
22+
23+
while l < r
24+
curr = nums[i]
25+
max = curr + nums[r - 1] + nums[r]
26+
27+
break if target - max > min.abs
28+
29+
min_sum = curr + nums[l] + nums[l + 1]
30+
31+
break if min_sum - target > min.abs
32+
33+
sum = curr + nums[l] + nums[r]
34+
35+
return sum if sum == target
36+
37+
diff = sum - target
38+
min = diff if diff.abs < min.abs
39+
40+
r -= 1 if diff.positive?
41+
l += 1 if diff.negative?
42+
end
43+
end
44+
45+
target + min
46+
end

test/medium/test_16_3sum_closest.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# frozen_string_literal: true
2+
3+
require_relative '../test_helper'
4+
require_relative '../../lib/medium/16_3sum_closest'
5+
require 'minitest/autorun'
6+
7+
class ThreeSumClosestTest < ::Minitest::Test
8+
def test_default
9+
assert_equal(2, three_sum_closest([-1, 2, 1, -4], 1))
10+
assert_equal(0, three_sum_closest([0, 0, 0], 1))
11+
end
12+
end

0 commit comments

Comments
 (0)