16. 3Sum Closest Medium

@problem@discussion
#Array#Two Pointers#Sorting



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


Back
© 2025 bowen.ge All Rights Reserved.