我正在从hackerrank进行此数组操作问题,它告诉我运行时错误。在我看来,时间复杂度为O(n)。但是它仍然有这个问题。有人可以帮我吗?
下面是link:
从1索引的零数组和一个操作列表开始,对于每个操作,在两个给定索引(含两个)之间为每个数组元素添加一个值。完成所有操作后,返回数组中的最大值。
例如,零数组的长度。您的查询列表如下:
a b k 1 5 3 4 8 7 6 9 1
在索引之间(包括两个端点)添加值:
index -> 1 2 3 4 5 6 7 8 9 10 [0,0,0, 0, 0,0,0,0,0, 0] [3,3,3, 3, 3,0,0,0,0, 0] [3,3,3,10,10,7,7,7,0, 0] [3,3,3,10,10,8,8,8,1, 0]
最大值是在执行所有操作之后。
我在这里附加了我的代码:
def arrayManipulation(n,queries):
increment=[]
value=[]
for i in range(n):
increment+=[0]
value+=[0]
for j in range(m):
left=queries[j][0]
right=queries[j][1]
k=queries[j][2]
increment[left-1]+=k
if right>=n:
continue
else:
increment[right]-=k
value[0]=increment[0]
for i in range(1,n):
value[i]=value[i-1]+increment[i]
maximum=max(value)
return maximum
答案 0 :(得分:4)
如果只是在正确的索引处进行加/减操作,则可以简化此问题-因此您只有2个操作,而不是2000个操作
1 2000 3
您的查询列表如下:
a b k
1 5 3
4 8 7
6 9 1
# demonstation purposes, do not create list with 200k zero entries - use a dict. see below.
[+3, 0, 0, 0, -3, 0, 0, 0, 0, 0] # 2 index ops by 1 5 3
[+3, 0, 0, +7, -3, 0, 0, -7, 0, 0] # 2 index ops by 4 8 7
[+3, 0, 0, +7, -3, +1, 0, -7,-1, 0] # 2 index ops by 6 9 1
# sums:
3 3 3 10 7 8 8 1 0 0 # for loop through list, adding all, remembering max
您只需遍历整个列表即可获得最大价值,只需将所有数字加起来并在传递过程中记住最大价值即可。
这简化了巨大列表的整个问题,破坏了您的内存/计算时间。
而不是这样做(对于200k长的列表)
1 2000 3 # 2000 times change value
11 2000 3 # 2000 times change value
21 2000 3 # 2000 times change value
31 2000 3 # 2000 times change value
41 2000 3 # 2000 times change value
您进行10次值更改:
# demonstation purposes, do not create list with 200k zero entries - use a dict. see below.
[ ..., +3, ..., +3, ..., +3, ..., +3, ..., +3, ............,
-3, ..., -3, ..., -3, ..., -3, ..., -3, ...]
{1:3, 11:3, 21:3, 31:3, 41:3, 2001:-3, 2011:-3, 2021:-3, 2031:-3, 2041:-3}
,并在按键排序并添加值时得到:
3, 6, 9, 12, 15, 18, 15, 13, 12, 9, 6, 3
您应该能够将这些东西插入键==位置的字典中(如果它多次出现,请确保更新键的值而不是替换键:
3 7 3
3 9 3
3 5 3
{3:9,7:-3, 9:-3, 5:-3} # 3 updated several times
弄清楚这些想法是使某些hackerrank有趣的原因(虽然很多都是不好的/不清楚的)。
这是代码,很有趣-复制和粘贴解决方案并不是什么成就-这就是为什么我没有首先编写代码的原因...
maxElem, inputs = [int(n) for n in input().split(" ")]
d = {}
for _ in range(inputs):
x, y, incr = [int(n) for n in input().split(" ")]
d.setdefault(x,0)
d[x]=d[x]+incr
if(y <= maxElem+2):
d.setdefault(y+1,0)
d[y+1]=d[y+1]-incr
maxx = 0
x= 0
for i in sorted(d):
x+=d[i]
if(maxx<x):
maxx=x
print(maxx)
答案 1 :(得分:0)
导入java.io。*;
import java.math。*;
导入java.security。; 导入java.text。;
导入java.util。*;
导入java.util.concurrent。*;
导入java.util.regex。*;
公共类解决方案{
// Complete the arrayManipulation function below.
static void findMax(int n, int a[],int b[], int k[], int m)
{ int [] arr = new int [n];
// Start performing m operations
for(int i = 0; i < m; i++)
{
// Store lower and upper index i.e. range
int lowerbound = a[i];
int upperbound = b[i];
// Add 'k[i]' value at this operation to
// whole range
for(int j = lowerbound; j < upperbound; j++)
arr[j]=arr[j]+k[i];
}
// Find maximum value after all
// operations and return
int res = Integer.MIN_VALUE;
for(int i = 0; i < n; i++)
res = Math.max(res, arr[i]);
System.out.println(res);
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n=scan.nextInt();
int m=scan.nextInt();
int a[]=new int[3];
int b[]=new int[3];
int k[]=new int[3];
for(int i=0;i<a.length;i++)
{
a[i]=scan.nextInt();
b[i]=scan.nextInt();
k[i]=scan.nextInt();
}
findMax(n,a,b,k,m);
}
}