谁能帮助我减少以下代码的时间复杂度?

时间:2019-09-21 02:34:07

标签: c++ time-complexity

我是hackerrank的新手。我总是更喜欢编码而不寻求解决方案。通过这样做,我遇到了这个问题,因为我的代码(如下所示)正在获得所需的输出,但对于大型输入,它不会在期限内执行。因此,任何人都可以帮助我减少时间的复杂性。还告诉我,编码而不寻找解决方案是好事还是坏事...

long arrayManipulation(int n,int m, vector<vector<int>> q) {
    long result=0;
vector<long> arr(n,0);

for(long i=0;i<m;i++)
{
    for(long t=q[i][0];t<=q[i][1];t++)
    {
        arr[t-1]+=q[i][2];
    }

}

for(long i=0;i<n;i++)
{
    if(result<arr[i])
    {result=arr[i];}
}

return result;
}

These seven test cases aren't passing

1 个答案:

答案 0 :(得分:0)

这可以减少:

vector<long> arr(n,0);
for(long i=0;i<m;i++)
{
    for(long t=q[i][0];t<=q[i][1];t++)
    {
        arr[t-1]+=q[i][2];
    }

}

类似于:

vector<long> arr(n + 1,0);  // n+1 needed because q[i][1] can be n-1
for(long i=0;i<m;i++)
{
    arr[q[i][0]] += q[i][2];
    arr[q[i][1] + 1] -= q[i][2];
}
long sum = 0;
for(long i=0;i<m;i++) {
    sum += arr[i];
    arr[i] = sum;
}

这是可行的,因为例如让a := [0, 0, 0, 0, 0]且您要为初始数组从2nd到4th的元素添加5(不包括在内),则可以执行a[1] += 5a[3] -= 5a[0, 5, 0, -5, 0]),然后在a上计算前缀总和,这就是您需要向初始数组([0, 5, 5, 0, 0] )。