保持一个并行数组b。使b[0]=0。运行以遍历a的元素。随着您的进行,将b的值设置为 a的连续单元格的差异。
因此,如果
a[0]=9
a[1]=4
a[2]=17
a[3]=2
a[4]=3
a[5]=6
a[6]=0
a[7]=3
a[8]=1
a[9]=1
a[10]=7
然后,
b[0]=0
b[1]=-5
b[2]=13
b[3]=-15
b[4]=1
b[5]=3
b[6]=-6
b[7]=3
b[8]=-2
b[9]=0
b[10]=6
您应该关心的是b数组中的 (-) 单元格。现在,开始在数组b上向后迭代——从
上面的b[10]开始,例如。保持一个currentMax值。最初设置为数组上的第一个最大值 (+) - 对于数组末尾的 (-) 条目,您无能为力。当您从b[b.length]向下迭代到b[0]时,请执行以下操作:
更新currentMax:
currentMax += <value at the current cell of **b**>
if (currentMax<0) then /* you've hit elements-with-no-indexes*/ 然后继续直到你找到一个正的b[i]条目,当你找到一个时,将currentMax的值设置为它。
currentMax的 (+) 值表示重置currentMax的单元格是迄今为止访问过的所有单元格的索引的单元格,(-) 值是无索引单元格。
在上面,例如,a[10]处的 7 是a[3]..a[9]中所有的索引,因为 - currentMax是在单元格 10 处初始化的那个(之后不会重置) - currentMax之后的值所有这些添加仍然是 (+) 一直到单元格 4(单元格 4 反映了从单元格 3 到单元格 4 的变化)
在b[3]处,currentMax低于 0——意味着单元格 2 没有索引。在b[2]处找到的值为正,而currentMax 处为负——因此在 b[3]处设置 currentMax=13并继续迭代。
数组大小呈线性 - 需要O(n)时间。