我有一个数组说A(0索引)大小为1。
我想在索引k1(k1> = 0)和A.size() - 1(即最后一个元素)之间找到数组A中的最小值。
然后我会在数组的末尾插入值:(给定范围中的最小元素+一些“随机”常量)。然后我有另一个查询来查找索引k2和A.size() - 1之间的最小值。我发现,在最后插入值:(在给定范围内最小值+另一个“随机”常量)。我必须做很多这样的询问。
说,我有N个查询。天真的方法需要O(N ^ 2)。
不能使用段树,因为数组不是静态的。但是,一个聪明的方法是使段大小为N + 1阵列;事先用无穷大填充未知值。这会给我O(Nlog N)的复杂性。
是否存在NlogN复杂性甚至N?
的其他方法答案 0 :(得分:2)
这里绝对不需要使用树之类的高级数据结构。只需一个简单的局部变量和列表即可完成所有操作:
创建一个空列表(例如minList
)。
从end
索引开始,直到最初给定的数组的start
索引,放入最小值(直到end
的索引)在列表的前面(即做push_front
)。
让我们说提供的数组是:
70 10 50 40 60 90 20 30
因此结果minList
将是:
10 10 20 20 20 20 20 30
执行此操作后,仅需要跟踪连续修改数组中新添加的元素中的最小值(例如,minElemAppended
)。< / p>
假设您获得k = 5
和randomConstant
= -10,那么
minElemAppended = minimum(minList[k-1] + randomConstant, minElemAppended)
采用这种方法,
O(N)
来处理N
次查询。O(N)
用于存储minList