【Leetcode】【Medium】3Sum Closest
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
解题:
数字求和问题,除了使用hash表使查找复杂度降为o(1)外,没有其他特别的方法。基本的思路都是枚举某一个数,然后计算余下的数字组合;
本题先对数组进行排序,然后以某一个数为基准,设置两个指针从两头操作余下的数,计算三数的和,如果和大于target,右指针左移,反之,左指针右移。期间不断记录离target最近的sum值。
总时间复杂度o(nlogn) + o(n2) = o(n2)
需要用到C++ abs函数,求绝对值。
代码:
(由于题目中说一定存在一个答案,因此省略判断某些边界情况)
1 class Solution { 2 public: 3 int threeSumClosest(vector<int> &num, int target) { 4 sort(num.begin(), num.end()); 5 int size = num.size(); 6 int min_gap = INT_MAX; 7 8 for (int i = 0; i < size; ++i) { 9 int j = i + 1; 10 int k = size - 1; 11 12 while (j < k) { 13 int cur_gap = num[i] + num[j] + num[k] - target; 14 if (abs(cur_gap) < abs(min_gap)) 15 min_gap = cur_gap; 16 17 if (cur_gap > 0) 18 --k; 19 else if (cur_gap < 0) 20 ++j; 21 else 22 return target; 23 } 24 } 25 26 return target + min_gap; 27 } 28 };