【发布时间】:2021-10-03 19:19:43
【问题描述】:
我需要有效的算法来解决这个问题(时间复杂度小于 O(n^2)),请帮助我:
a[i..j] 被称为 a[i..j] 给定数组 A[1..n], (n 的 k 的最大值
例如,n=10:2 2 1 4 3 2 5 4 2 3 答案是 4
很容易看出 k
而且我不知道如何处理 a[i]
【问题讨论】:
-
我在编辑后恢复了答案。
我需要有效的算法来解决这个问题(时间复杂度小于 O(n^2)),请帮助我:
a[i..j] 被称为 a[i..j] 给定数组 A[1..n], (n 的 k 的最大值
例如,n=10:2 2 1 4 3 2 5 4 2 3 答案是 4
很容易看出 k
而且我不知道如何处理 a[i]
【问题讨论】:
使用具有范围更新的 Fenwick 树。树中的每个索引表示窗口A 中有多少数字小于它的计数。要使窗口有效,B(右侧窗口)中的每个元素都必须在 A(左侧窗口)中有一个伙伴。当我们将数字x 移入A 时,我们将1 添加到树中的[x+1, 1000] 范围内。对于从 B 移动到 A 的元素,在其树索引中添加 1。对于B 中的每个新元素,将-1 添加到其在树中的索引中。如果索引低于零,则窗口无效。
例如,我们有:
2 2 1 4 3 2 5 4 2 3
2 2
|
Tree:
add 1 to [3, 1000]
add -1 to 2
idx 1 2 3 4 5
val 0 -1 1 1 1 (invalid)
2 2 1 4 3 2 5 4 2 3
2 2 1 4
|
Tree:
add 1 to [3, 1000]
add 1 to 2 (remove 2 from B)
add -1 to 1
add -1 to 4
idx 1 2 3 4 5
val -1 0 2 1 2 (invalid)
2 2 1 4 3 2 5 4 2 3
2 2 1 4 3 2
|
Tree:
add 1 to [2, 1000]
add 1 to 1 (remove 1 from B)
add -1 to 3
add -1 to 2
idx 1 2 3 4 5
val 0 0 2 2 3 (valid)
2 2 1 4 3 2 5 4 2 3
2 2 1 4 3 2 5 4
|
Tree:
add 1 to [5, 1000]
add 1 to 4 (remove 4 from B)
add -1 to 5
add -1 to 4
idx 1 2 3 4 5
val 0 0 2 2 3 (valid)
2 2 1 4 3 2 5 4 2 3
2 2 1 4 3 2 5 4 2 3
|
Tree:
add 1 to [4, 1000]
add 1 to 3 (remove 3 from B)
add -1 to 2
add -1 to 3
idx 1 2 3 4 5
val 0 -1 2 3 4 (invalid)
【讨论】: