我是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;
}
答案 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] += 5
,a[3] -= 5
(a
是[0, 5, 0, -5, 0]
),然后在a
上计算前缀总和,这就是您需要向初始数组([0, 5, 5, 0, 0]
)。