3sum LTE at leetcode

3sum LTE at leetcode

本文关键字:leetcode at LTE 3sum      更新时间:2023-10-16

我在leetcode.com

上做3sum问题

蛮力的时间复杂性是o(n^3(。

我使用一个标签,所以我认为时间复杂性是o(n^2(。

但是,我仍然有一个TLE(超过时间限制(

如何加快代码?

以下是我的代码

非常感谢!

class Solution public:
vector<vector<int>> threeSum(vector<int>& nums) {
    vector<vector<int>> ANS;
    if(nums.size() < 3) return ANS;
    map<int,int*> hashtable;
    map<int,int*>::iterator it;
    vector<int> ans;
    for(int i=0;i < nums.size();i++)
    {
        for(int j=i+1;j < nums.size();j++ )
         {
            it = hashtable.find(nums[j]);
            if(it != hashtable.end() ) //found target
            {
                ans.push_back(nums[j]);
                ans.push_back((it)->second[0]);
                ans.push_back((it)->second[1]);
                sort(ans.begin(),ans.end());
                ANS.push_back(ans);
                ans.clear();
            }
            else
            {
                int* temp = new int[2];
                temp[0]=nums[i];
                temp[1]=nums[j];
                hashtable[0-nums[i]-nums[j]]=temp; 
            }
         } 
         hashtable.clear();
    }
    sort( ANS.begin(), ANS.end() );
    ANS.erase( unique( ANS.begin(), ANS.end() ), ANS.end() );
    return ANS;
}};

您的解决方案实际上不是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;
}

让我知道您是否有任何疑问。希望它有帮助!