我正在尝试解决hackerrank上的数组操作问题,但是 在某些测试案例中显示“由于超时而终止”。怎么会 固定吗?
这里是问题的链接: https://www.hackerrank.com/challenges/crush/problem
这是我要解决的代码。
// Complete the arrayManipulation function below.
long arrayManipulation(int n, vector<vector<int>> queries) {
ll* a=new ll[n];
ll k;
for(k=0;k<n;k++){
a[k]=0;
}
ll i,j,b,c,s;
long int m=-999999;
for(i=0;i<queries.size();i++){
b=queries[i][0]-1;
c=queries[i][1]-1;
s=queries[i][2];
for(j=b;j<=c;j++){
a[j]=a[j]+s;
if(a[j]>m)
m=a[j];
}
}
delete [] a;
return m;
}
这是导致“由于以下原因而终止”的测试用例之一 超时”。
Input
10000000 100000
7253005 9867484 26205
933415 3777144 94765
4459151 9562860 92614
2789917 8588211 4461
4044644 5402538 67512
5713942 9159751 16533
9098636 9929072 64666
292166 3522306 31552
894426 9902580 83056
741032 5667470 18090
3359393 5436826 85573
6370240 8401950 79068
1996715 3345743 41927
205681 8652011 46490
210142 2696654 65379
4372756 6194007 79320
4301827 5510540 94307
2991558 7824132 2824
243063 3223110 97250{-truncated-}
<<Plz Download to view the full testcase>>
Expected Output
2490686975
答案 0 :(得分:0)
答案:提出更快的算法。
这不是一个简单的问题(尽管它实际上是“中等”恕我直言,但在Hackerrank上标记为“困难”),因此不要指望所描述算法的字面实现会解决该问题。该算法需要花费 O(nm)时间,但是有一种简单的方法只需花费 O(n + m)时间。我用10行代码在Hackerrank上进行了编码:第一次尝试通过了所有测试用例。
在这里我不给您解决方案,因为您应该自己解决,但是除了初始化之外,在 m 查询中只有一遍,接受了 O (1)的每个工作量,然后在 n 元素上进行一次遍历,再次为每个工作承担 O(1)的工作。提示:区别对待。