Skip to content

Commit 873ca5c

Browse files
committed
3Sum Closest
1 parent c9d38b9 commit 873ca5c

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

16.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
class Solution {
2+
public:
3+
int threeSumClosest(vector<int>& nums, int target) {
4+
5+
int ans = numeric_limits<int>::max();
6+
int min_diff = numeric_limits<int>::max();
7+
8+
if (nums.size() < 3) {
9+
return ans;
10+
}
11+
12+
// Make nums in increasing order. Time: O(nlogn)
13+
sort(nums.begin(), nums.end());
14+
15+
for (int i = 0; i < nums.size() - 2; ++i) {
16+
if (i == 0 || nums[i] != nums[i - 1]) { // Skip duplicated.
17+
for (int j = i + 1, k = nums.size() - 1; j < k; ) { // Time: O(n) for each i.
18+
if (j - 1 > i && nums[j] == nums[j - 1]) { // Skip duplicated.
19+
++j;
20+
} else if (k + 1 < nums.size() && nums[k] == nums[k + 1]) { // Skip duplicated.
21+
--k;
22+
} else {
23+
const auto sum = nums[i] + nums[j] + nums[k];
24+
if (sum > target) { // Should decrease sum.
25+
--k;
26+
} else if (sum < target) { // Should increase sum.
27+
++j;
28+
} else {
29+
return target;
30+
}
31+
32+
if (abs(sum - target) < min_diff) {
33+
min_diff = abs(sum - target);
34+
ans = sum;
35+
}
36+
}
37+
}
38+
}
39+
}
40+
41+
return ans;
42+
}
43+
};

0 commit comments

Comments
 (0)