3Sum Closest
如果在递归的最后环节是求两个数的和与target最近的情况,应该会快一些。当然,主要是为了解决4Sum及以上的情形,所以使用了dp加递归的方式,3Sum的情形使用非递归的方式会更快也会比较简洁。
class Solution { public: int threeSumClosest(vector<int> &num, int target) { // Start typing your C/C++ solution below // DO NOT write int main() function sort(num.begin(), num.end()); return nSumClosest(num, target, 3, 0); } private: int nSumClosest(const vector<int> &num, int target, int n, int pos) { int len = num.size(); int result = 0x0fffffff; if (n < 1 || len - pos < n) { return result; } if (n == 1) { return oneClosest(num, target, pos); } for (int i = pos; i <= len - n; ++i) { int part_result = nSumClosest(num, target - num[i], n - 1, i + 1); result = abs(part_result + num[i] - target) > abs(result - target) ? result : part_result + num[i]; } return result; } int oneClosest(const vector<int> &num, int target, int pos) { int begin = pos; int end = num.size() - 1; int result = num[(begin + end) / 2]; while (begin <= end) { int cur = (begin + end) / 2; if (num[cur] == target) { return num[cur]; } else if (num[cur] < target) { begin = cur + 1; } else { end = cur - 1; } result = abs(target - num[cur]) > abs(result - target) ? result : num[cur]; } return result; } };
Passion, patience, perseverance, keep it and move on.

浙公网安备 33010602011771号