我将假设所有更新(加法/减法)操作都发生在找到最大值/最小值之前。对于将更新和最小/最大操作混合在一起,我没有一个好的解决方案。
您可以使用普通数组,其中数组索引 i 处的值是索引 i 和原始数组的索引 (i - 1) 之间的差。这使得从索引 0 到我们数组的索引 i 的总和成为原始数组索引 i 处的值。
减法是与负数的加法,因此可以类似地对待它们。当我们需要从索引 i 到索引 j 的原始数组中添加 k 时,我们会将 k 添加到数组的索引 i,并减去 k 到数组的索引 (j + 1)。每次更新需要 O(1) 时间。
您可以通过累加对值求和并记录最大/最小值来找到原始数组的最小值/最大值。每次操作需要 O(n) 时间。我假设这对整个数组执行一次。
伪代码:
a[N] // Original array
d[N] // Difference array
// Initialization
d[0] = a[0]
for (i = 1 to N-1)
d[i] = a[i] - a[i - 1]
// Addition (subtraction is similar)
add(from_idx, to_idx, amount) {
d[from_idx] += amount
d[to_idx + 1] -= amount
}
// Find max/min for the WHOLE array after add/subtract
current = max = min = d[0];
for (i = 1 to N - 1) {
current += d[i]; // Sum from d[0] to d[i] is a[i]
max = MAX(max, current);
min = MIN(min, current);
}