3sum LTE在leetcode

时间:2017-04-25 18:01:15

标签: c++ algorithm

我正在leetcode.com上做3sum问题

蛮力的时间复杂度为O(N ^ 3)。

我使用哈希表,所以我认为时间复杂度为O(N ^ 2)。

但是,我仍然有TLE(超出时间限制)

如何加速我的代码?

下面是我的代码

非常感谢!

{{1}}

1 个答案:

答案 0 :(得分:0)

你的解决方案实际上不是O(n^2),它绝对比O(n^2)贵。 O(n^2)中没有任何优化的解决方案将无法通过OJ。这是我的解决方案O(n^2)。我在代码中加了解释说明。

vector<vector<int> > threeSum(vector<int> &num) {
    vector <vector<int> > result;
    size_t n = num.size();
    if(n < 3) return result;

    vector<int> solution(3);
    sort(num.begin(), num.end());
    for(int i = 0; i < n - 2; ++i) {
        int start = i + 1, end = n - 1;

        while(start < end) {
            int sum = num[start] + num[end] + num[i];
            if(sum == 0) {
                solution.at(0) = num[i];
                solution.at(1) = num[start];
                solution.at(2) = num[end];
                result.push_back(solution);
                // these loops will skip same elements and fasten the algorithm
                // while(start < n - 1 and num[start] == num[start + 1]) start++;
                // while(end > i + 1 and num[end] == num[end - 1]) end--;
                start++, end--;
            } else if(sum > 0) {
                // while(end > i + 1 and num[end] == num[end - 1]) end--;
                end--;
            } else {
                // while(start < n - 1 and num[start] == num[start + 1]) start++;
                start++;
            }
        }
        while(i < n - 1 and num[i] == num[i + 1]) i++;
    }

    return result;
}

如果您有任何疑问,请与我们联系。希望它有所帮助!