Skip to content

Commit db5d393

Browse files
solve 16
1 parent 653c24d commit db5d393

File tree

2 files changed

+106
-0
lines changed

2 files changed

+106
-0
lines changed

src/solution/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,4 @@ mod s0455_assign_cookies;
4242
mod s0986_interval_list_intersections;
4343
mod s0855_exam_room;
4444
mod s0881_boats_to_save_people;
45+
mod s0016_3sum_closest;

src/solution/s0016_3sum_closest.rs

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/**
2+
* [16] 3Sum Closest
3+
*
4+
* Given an integer array nums of length n and an integer target, find three integers in nums such that the sum is closest to target.
5+
* Return the sum of the three integers.
6+
* You may assume that each input would have exactly one solution.
7+
*
8+
* Example 1:
9+
*
10+
* Input: nums = [-1,2,1,-4], target = 1
11+
* Output: 2
12+
* Explanation: The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
13+
*
14+
* Example 2:
15+
*
16+
* Input: nums = [0,0,0], target = 1
17+
* Output: 0
18+
*
19+
*
20+
* Constraints:
21+
*
22+
* 3 <= nums.length <= 1000
23+
* -1000 <= nums[i] <= 1000
24+
* -10^4 <= target <= 10^4
25+
*
26+
*/
27+
pub struct Solution {}
28+
29+
// problem: https://leetcode.com/problems/3sum-closest/
30+
// discuss: https://leetcode.com/problems/3sum-closest/discuss/?currentPage=1&orderBy=most_votes&query=
31+
32+
// submission codes start here
33+
34+
impl Solution {
35+
pub fn three_sum_closest(nums: Vec<i32>, target: i32) -> i32 {
36+
let mut inputs = nums.clone();
37+
inputs.sort();
38+
// println!("inputs is {:?}", inputs);
39+
let mut res = 0;
40+
let mut diff = std::i32::MAX;
41+
42+
for i in 0..inputs.len() {
43+
let mut j = i + 1;
44+
let mut k = inputs.len() - 1;
45+
let mut sum = 0;
46+
while j < k {
47+
sum = inputs[i] + inputs[j] + inputs[k];
48+
// println!("i, j , k is {}, {}, {}, sum is {}", i, j, k, sum);
49+
if sum == target {
50+
return sum;
51+
} else if sum < target {
52+
if i32::abs(sum - target) < diff {
53+
diff = i32::abs(sum - target);
54+
res = sum;
55+
}
56+
j += 1;
57+
} else {
58+
if i32::abs(sum - target) < diff {
59+
diff = i32::abs(sum - target);
60+
res = sum;
61+
}
62+
k -= 1;
63+
}
64+
}
65+
66+
}
67+
68+
res
69+
}
70+
}
71+
72+
// submission codes end
73+
74+
#[cfg(test)]
75+
mod tests {
76+
use super::*;
77+
78+
#[test]
79+
fn test_16_0() {
80+
let nums = vec![-1,2,1,-4];
81+
let target = 1;
82+
assert_eq!(Solution::three_sum_closest(nums, target), 2);
83+
}
84+
85+
#[test]
86+
fn test_16_1() {
87+
let nums = vec![0, 0, 0];
88+
let target = 1;
89+
assert_eq!(Solution::three_sum_closest(nums, target), 0);
90+
}
91+
92+
#[test]
93+
fn test_16_3() {
94+
let nums = vec![0, 1, 2];
95+
let target = 3;
96+
assert_eq!(Solution::three_sum_closest(nums, target), 3);
97+
}
98+
99+
#[test]
100+
fn test_16_4() {
101+
let nums = vec![1, 1, 1, 0];
102+
let target = -100;
103+
assert_eq!(Solution::three_sum_closest(nums, target), 2);
104+
}
105+
}

0 commit comments

Comments
 (0)