这道题出的让人不解气,怎么说呢?我苦思冥想很久,发现没有特别聪明的方法解决。最后无奈查了一下,发现该题最佳时间复杂度是 O(n^2),顿时心血上涌,痛不欲生。

强迫症所致,见不得 O(nlogn) 以下的解决方案。

但因为做了一些搜索,我在 stackoverflow 上面看到了这样一个帖子

他分析的比我好多了,而我的解决方案也是依照他的算法来的。效率还算可以,建议没想通的去读一读。

#include <vector>
#include <algorithm>
using std::vector; 

class Solution {
public:
    int threeSumClosest(vector<int> &num, int target) {
        std::sort(num.begin(), num.end());
        int min{INT_MAX}, sum{0}, tmpsum{0};
        for (auto it=num.cbegin(); it!=num.cend(); ++it)
            for (auto b = std::next(it), e = std::prev(num.cend()); b<e; tmpsum > target ? --e : ++b)
                if ((tmpsum = *it + *b + *e) == target) return target;
                else if (std::abs(tmpsum - target) < min) {sum = tmpsum; min = std::abs(tmpsum - target);}
        return sum;
    }
};

LeetCode Direct Link