【问题标题】:How can I update a range within an array with a sequence如何使用序列更新数组中的范围
【发布时间】:2022-08-14 01:11:09
【问题描述】:

给定一个值数组,如何有效地使用该数组中的序列更新范围?
更新执行多次。执行完所有更新后,我们可以查询数组的任何索引以获取其最终值。

如果我们在索引i 处更新v 的值,则索引j 处的每个元素都会增加一个值
max { v - | i - j | , 0 }

例如。

array = {1,1,1,1,1,1}  

现在我在索引处进行更新4值为3结果数组将如下所示:

array = {1,1,2,3,4,3}  


我想有效地执行这两个操作。

  • array = {1,1,2,3,4,3}你忘了解释原因。
  • 似乎您在示例中跳过了几个步骤。
  • \"索引 j 处的每个元素\"?索引 j 处只有一个元素。您的意思是“索引 i 以外的每个元素”?而且我不明白,如果您将 3 放在索引 4 处,会如何更改索引 3 处的值。您需要更好地解释您的问题。
  • 正如大家所说,请更好地解释这个问题。可能会添加一些示例以及您如何得出答案。另外,请添加您编写的任何代码,以便为我们提供更好的主意。

标签: arrays algorithm data-structures


【解决方案1】:

您无法“有效地”更新一系列元素。像这样的问题总是关于弄清楚如何避免完全更新一系列元素。

要弄清楚这一点,请考虑两个操作:

  • INTEGRATE(A) 接受一个数组并将每个元素 A[i] 替换为 sum(A[0]...A[i])
  • DIFF(A) 接受一个数组并将每个元素替换为与前一个元素的差异(第一个元素保持不变)。

这些操作有一些重要的属性:

  • 它们是相反的:INTEGRATE(DIFF(A)) = DIFF(INTEGRATE(A)) = A 对于所有数组 A;和
  • 它们是线性的:如果A = B+C,则INTEGATE(A) = INTEGRATE(B) + INTEGRATE(C)DIFF 也是如此。

您的最终数组是原始数组的总和,加上一大堆“三角形”数组。假设它是A + T1 + T2 + T3... 等。

这些三角形中的每一个都有一大堆非零元素,但是请注意当您应用DIFF 两次时会发生什么:

[0,0,1,2,3,2,1,0,0] -> [0,0,1,1,1,-1,-1,-1,0] -> [0,0,1,0,0,-2,0,0,1]

结果只有3非零元素。这为我们提供了一种快速计算最终数组的方法。

D(X) = DIFF(DIFF(X)) 并让I(X) = INTEGRATE(INTEGRATE(X))。然后计算A + T1 + T2 + T3...,而不是计算I( D(A) + D(T1) + D(T2) + D(T3)... )

由于所有D(Tx) 最多有 3 个非零元素,因此可以快速轻松地将它们添加到结果中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多