一只蚱蜢坐在一条长度为 n 的格子条前面。每个单元格包含一个数字。 KuznechiK 可以向前跳跃 1,2,... k 个单元格。您需要到达最右边的单元格,同时收集尽可能少的数量。输入是 n、k 和 n 个像元值。我不知道如何以最佳方式解决问题。目前,我只想使用该平台,在每个新单元格后添加一个新值,并在必要时删除旧单元格。但事实证明,每次我都必须在牌组中寻找新的最小值。有更好的选择吗?
一只蚱蜢坐在一条长度为 n 的格子条前面。每个单元格包含一个数字。 KuznechiK 可以向前跳跃 1,2,... k 个单元格。您需要到达最右边的单元格,同时收集尽可能少的数量。输入是 n、k 和 n 个像元值。我不知道如何以最佳方式解决问题。目前,我只想使用该平台,在每个新单元格后添加一个新值,并在必要时删除旧单元格。但事实证明,每次我都必须在牌组中寻找新的最小值。有更好的选择吗?
1. 两个栈上排队
最小感知队列构建在两个最小感知堆栈上。
2. 升序队列
这个想法是借用MBo的回答。普通双端队列,但是新元素从队列末尾删除大于或等于它们的元素。很明显,这些大的因素未来将无法影响最小的因素。该队列在每个时间点都按升序排列。
比较
两个队列都为解决问题提供了线性复杂度。哪个常数更好?
表中,“两个堆栈”和“有序队列”的时间用分数表示。有序队列注意到k变化很小- 对于随机数据,该队列很短。 “两堆”总是更糟糕。有时两次,有时更多。
路线恢复
如果将路由(索引列表)添加到队列元素中,则可以将其恢复: