-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path16_3sum_closest.cpp
64 lines (50 loc) · 1.23 KB
/
16_3sum_closest.cpp
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "test.h"
class Solution {
public:
int abs(int a)
{
return a < 0 ? -a : a;
}
int threeSumClosest(vector<int>& nums, int target)
{
if (nums.size() < 3)
return 0;
auto ret = nums[0] + nums[1] + nums[2];
if (nums.size() == 3)
return ret;
sort(nums.begin(), nums.end());
auto i = 0u;
while (i < nums.size() - 2)
{
auto j = i + 1;
auto k = nums.size() - 1;
while (j < k)
{
auto tmp = nums[i] + nums[j] + nums[k];
auto oldDist = ret - target;
auto dist = tmp - target;
if (abs(oldDist) > abs(dist))
ret = tmp;
if (dist == 0)
return tmp;
dist > 0 ? --k : ++j;
}
if (nums[i] > target)
return ret;
++i;
}
return ret;
}
};
int main()
{
vector<tuple<vector<int>, int>> datas =
{
//{{1,1,1,0},100},
{{0,2,1,-3}, 1},
};
Solution s;
for (auto& data : datas)
cout << s.threeSumClosest(std::get<0>(data), std::get<1>(data)) << endl;
return 0;
}