理解数组行为的算法[重复]
Posted
技术标签:
【中文标题】理解数组行为的算法[重复]【英文标题】:Algorithm for understanding behavior of arrays [duplicate] 【发布时间】:2017-06-24 16:46:44 【问题描述】:给你一个大小为 N 的列表,用零初始化。您必须对列表执行 M 操作并输出列表中所有 N 个元素的最终值的最大值。对于每个操作,您都会获得三个整数 a、b 和 k,并且您必须为从 index 到(包括两者)的所有元素添加值。
输入格式
第一行将包含两个整数 N 和 M,由一个空格分隔。 接下来的 M 行将包含三个整数 a、b 和 k,由一个空格分隔。 列表中的数字从 1 到 N 编号。
约束Click here
输出格式
更新列表中包含最大值的单行。
示例输入
5 3 1 2 100 2 5 100 3 4 100
样本输出
200
说明 第一次更新后列表将是 100 100 0 0 0。 第二次更新后列表将是 100 200 100 100 100。 第三次更新后列表将是 100 200 200 200 100。 所以要求的答案是 200。
时间复杂度较低的解决方案之一
n, inputs = [int(n) for n in input().split(" ")]
list = [0]*(n+1)
for _ in range(inputs):
x, y, incr = [int(n) for n in input().split(" ")]
list[x-1] += incr
if((y)<=len(list)):
list[y] -= incr
max = x = 0
for i in list:
x=x+i;
if(max<x):max=x
print(max)
有人可以解释上述解决方案吗?
【问题讨论】:
这是一个活跃的编程竞赛吗? 不。这是hackerrank的练习题。 【参考方案1】:基本上它存储增量而不是最终列表;这意味着每个操作只需要 2 次读取和写入,而不是 (b - a + 1)。然后最后的max
扫描在进行过程中添加增量,这仍然是一个O(n)
操作,无论如何您都必须这样做。
n, inputs = [int(n) for n in input().split(" ")]
获取列表大小(n)和操作数(m),即5
和3
list = [0]*(n+1)
创建一个空的 0 填充列表。应该是lst = [0] * n
(不要使用list
作为变量名,它会隐藏内置类型)(我们不需要额外的结束单元格,除了作为我们算法的校验和 - 如果它正常工作,最终校验和应该是 0)。
for _ in range(inputs):
x, y, incr = [int(n) for n in input().split(" ")]
得到一个操作(a, b, k) 即1
, 2
, 100
。
list[x-1] += incr
将增量添加到起始单元格
if((y)<=len(list)):
list[y] -= incr
从结束单元格中减去增量(应该是if y < n: lst[y] -= incr
)
如果您在此处添加print(lst)
(在if
之后但在for
循环内),该算法可能更容易理解。
现在处理增量以找到最大项:
max = x = 0
for i in list:
x=x+i;
x
现在是当前列表单元格的实际值。此外,max
是一个糟糕的变量名,因为它隐藏了内置的 max()
函数。
if(max<x):max=x
保持跑步最大值
print(max)
显示结果。
【讨论】:
以上是关于理解数组行为的算法[重复]的主要内容,如果未能解决你的问题,请参考以下文章