-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path16_3sum_closest.rb
46 lines (32 loc) · 887 Bytes
/
16_3sum_closest.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# frozen_string_literal: true
# https://leetcode.com/problems/3sum-closest/
# @param {Integer[]} nums
# @param {Integer} target
# @return {Integer}
def three_sum_closest(nums, target)
n = nums.length
return nums[0] + nums[1] + nums[2] if n == 3
nums.sort!
n = nums.length
max = nums[n - 1] + nums[n - 2] + nums[n - 3]
return max if target > max
min = ::Float::INFINITY
(0...(n - 2)).each do |i|
l = i + 1
r = n - 1
while l < r
curr = nums[i]
max = curr + nums[r - 1] + nums[r]
break if target - max > min.abs
min_sum = curr + nums[l] + nums[l + 1]
break if min_sum - target > min.abs
sum = curr + nums[l] + nums[r]
return sum if sum == target
diff = sum - target
min = diff if diff.abs < min.abs
r -= 1 if diff.positive?
l += 1 if diff.negative?
end
end
target + min
end