lsmCC 发表于 2023-11-15 20:58:20

怎么优化代码,第四个点超时了

#include <bits/stdc++.h>
using namespace std;
int n;
const int N=2e5+10;
int a,b;
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
      b=i;
    }
    for(int j=1;j<=n;j++)
    {
      cin>>a;
    }
    int res=0;
    for(int i=1;i<=n;i++)
    {
       for(int j=i+1;j<=n;j++)
       {
      if(a-a==b-b)
      {
            res++;

      }
       }
      
    }
    cout<<res<<endl;

   

}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
      solve();
    }
}
求助大佬,只会暴力

isdkz 发表于 2023-11-15 20:58:37

你可以通过使用哈希表来优化你的代码。首先,我们可以将a-a[ i]和b-b[ i]的差值作为键,出现次数作为值,存储在一个哈希表中。然后在内层循环中,我们可以检查哈希表中是否存在a-a[ i]==b-b[ i]的情况,如果存在,则将对应的值累加到结果中。这样可以将时间复杂度优化为O(n),避免了暴力枚举的O(n^2)复杂度。

下面是修改后的代码:

#include <bits/stdc++.h>
using namespace std;
int n;
const int N=2e5+10;
int a,b;
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
      b[ i]=i;
    }
    unordered_map<int, int> diffCount; // 哈希表用于存储差值及其出现次数
    for(int j=1;j<=n;j++)
    {
      cin>>a;
    }
    int res=0;
    for(int i=1;i<=n;i++)
    {
      for(int j=i+1;j<=n;j++)
      {
            int diffA = a - a[ i];
            int diffB = b - b[ i];
            if(diffA == diffB)
            {
                res += diffCount; // 累加差值出现的次数
            }
            diffCount++; // 更新差值出现的次数
      }
    }
    cout<<res<<endl;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
      solve();
    }
}


通过使用哈希表来存储差值及其出现次数,可以将时间复杂度优化为O(n),避免了暴力枚举的O(n^2)复杂度,从而解决了超时的问题。
页: [1]
查看完整版本: 怎么优化代码,第四个点超时了