给出了两个整数N<=10^5
和K<=N
,其中N
是数组A[]
的大小,K
是我们可以选择的连续子序列的长度在我们的过程中。每个元素A[i]<=10^9
。现在假设最初所有数组元素都没有标记。在每个步骤中,我们将选择长度为K
的任何子序列,如果此子序列具有未标记的元素,那么我们将标记所有未标记的元素,这些元素在后序中是最小的。现在如何计算标记所有元素的最小步数?
为了更好地理解问题,请参阅此示例 -
N=5 K=3
A[]=40 30 40 30 40
步骤1-选择间隔[1,3]并标记A [1]和A [3]
步骤2 - 选择间隔[0,2]并标记A [0]和A [2]
步骤3-选择间隔[2,4]并标记A [4]
因此,此处的最小步骤数为3.
我的方法(速度不够快) -
我从数组的第一个元素开始,并在距离<=K
处将所有未标记的元素标记为等于它,并将steps
递增1.
答案 0 :(得分:3)
首先考虑如何回答K
== N
的问题(即对子序列的长度没有任何有效的限制)。您的答案应该是最小步数是数组中不同值的数量。
然后考虑当K
减少时这会如何变化;重要的是K
长度间隔的副本数量需要覆盖{i: A[i] == n}
中每个值n
的选择集A
。沿着K
行走A
- 长度间隔的天真算法,在A[i]
的值尚未覆盖的每个位置n
停止是完全足够的。
答案 1 :(得分:1)
我们看到最小步数= N / k或N / k + 1且最大步数=(n + k-1)。 我们必须优化步骤的总数,这取决于我们所做的选择的过去历史,这些选择涉及动态解决方案。
答案 2 :(得分:0)
可以在O(n)中解决如下: 跟踪每个元素a [i]。如果之前未跟踪[i],则映射数字及其索引并增加计数器。如果先前跟踪了数字,则检查其(最后一个index-curr_index)&gt; = K是否更新索引并增加计数。打印计数。 地图STL将是有益的。