谁能帮我降低以下代码的时间复杂度?

Can anyone help me reduce the time-complexity of the following code?

本文关键字:代码 时间复杂度      更新时间:2023-10-16

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

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;
}

这七个测试用例未通过

这可以减少:

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]并且您想为从第 2 个到第 4 个(不包括在内(的初始数组的元素添加 5,然后您可以执行a[1] += 5a[3] -= 5(a[0, 5, 0, -5, 0](,然后计算a上的前缀和,这将是您需要添加到初始数组的每个元素的多少(在这种情况下[0, 5, 5, 0, 0](。