理解数组行为的算法[重复]

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),即53

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 &lt; 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)

显示结果。

【讨论】:

以上是关于理解数组行为的算法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

有重复的背包 - 数组解决方案

重复造轮子系列--桶排序

算法剑指 Offer 03. 数组中重复的数字

算法--判断数组中是否有重复值

排序旋转整数数组,搜索算法[重复]

前端与算法 leetcode 26. 删除排序数组中的重复项