From 4ec72db4682437395ebfbe95d47ea06d783a03ad Mon Sep 17 00:00:00 2001 From: Sainnhe Park Date: Fri, 4 Nov 2022 15:03:06 +0800 Subject: [PATCH] s0016 --- include/s0016_3sum_closest.hpp | 14 ++++++++++++++ src/s0016_3sum_closest.cpp | 27 +++++++++++++++++++++++++++ tests/s0016_3sum_closest.cpp | 19 +++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 include/s0016_3sum_closest.hpp create mode 100644 src/s0016_3sum_closest.cpp create mode 100644 tests/s0016_3sum_closest.cpp diff --git a/include/s0016_3sum_closest.hpp b/include/s0016_3sum_closest.hpp new file mode 100644 index 0000000..b274cbc --- /dev/null +++ b/include/s0016_3sum_closest.hpp @@ -0,0 +1,14 @@ +#ifndef S0016_3SUM_CLOSEST +#define S0016_3SUM_CLOSEST + +#include +#include + +using namespace std; + +class Solution { + public: + int threeSumClosest(vector& nums, int target); +}; + +#endif diff --git a/src/s0016_3sum_closest.cpp b/src/s0016_3sum_closest.cpp new file mode 100644 index 0000000..eae47d2 --- /dev/null +++ b/src/s0016_3sum_closest.cpp @@ -0,0 +1,27 @@ +#include "s0016_3sum_closest.hpp" + +// 和上一道一样,排序 + 双指针 + +int Solution::threeSumClosest(vector& nums, int target) { + int sum = nums[0] + nums[1] + nums[2]; + int len = nums.size(); + sort(nums.begin(), nums.end()); + for (int i{1}; i < len - 1; i++) { + for (int j{0}, k = len - 1; j != k && i != j && i != k;) { + if (nums[i] + nums[j] + nums[k] > target) { + if (abs(nums[i] + nums[j] + nums[k] - target) < abs(sum - target)) { + sum = nums[i] + nums[j] + nums[k]; + } + k--; + } else if (nums[i] + nums[j] + nums[k] < target) { + if (abs(nums[i] + nums[j] + nums[k] - target) < abs(sum - target)) { + sum = nums[i] + nums[j] + nums[k]; + } + j++; + } else { + return nums[i] + nums[j] + nums[k]; + } + } + } + return sum; +} diff --git a/tests/s0016_3sum_closest.cpp b/tests/s0016_3sum_closest.cpp new file mode 100644 index 0000000..035b324 --- /dev/null +++ b/tests/s0016_3sum_closest.cpp @@ -0,0 +1,19 @@ +#include "s0016_3sum_closest.hpp" + +#include + +TEST(Problem16, Case1) { + vector nums{-1, 2, 1, -4}; + int target{1}; + int o{2}; + Solution solution; + EXPECT_EQ(solution.threeSumClosest(nums, target), o); +} + +TEST(Problem16, Case2) { + vector nums{0, 0, 0}; + int target{1}; + int o{0}; + Solution solution; + EXPECT_EQ(solution.threeSumClosest(nums, target), o); +}