找到长度为 W 的子数组,它由可以连续排列的数字组成。例如 - {4,5,1,5,7,6,8,4,1} 且 W 为 5,输出可以是 -{5,7,6,8,4}..
问问题
1075 次
1 回答
2
一个长度为 W 的连续子数组,包含一个连续(但未排序)的序列,具有三个可用于构造有效算法的属性:
- 子数组中有 W 个元素。
- 子数组中的最大和最小数字之间的差异是
W-1
。 - 子数组中没有重复的元素。
算法应该将两个指针提前到输入数组,并检查这些指针之间的子数组是否满足这三个属性。
- 推进两个指针以保持指针之间的差异等于 W。
- 在推进第一个指针的同时,将相应的数组元素放入一个集合(以控制重复项)和一个最小-最大队列(以控制数字范围)。
- 如果在集合中找到重复项,则将第二个指针前进到这些重复元素中的第一个的位置,同时更新集合和队列。
- 推进第二个指针,同时最大值和最小值之间的差值保持大于
W-1
,从集合和队列中删除相应的元素。 - 当所有三个属性都为真时停止。
最小最大队列可以实现为一对最小最大堆栈,如本答案中所述。集合可以实现为散列集(给出算法的 O(n) 预期复杂度),或二叉搜索树(给出 O(n log(n)) 最坏情况复杂度),或者作为bitset 和 ringbuffer - 只保留位,对应于最小值和最大值之间的元素,由队列报告(给出 O(n) 最坏情况复杂度)。
输入数组 {42,10,7,4,5,1,5,7,6,8,4,1} 和 W=5 的示例(“:”标记环形缓冲区的开始)。
subarray bitset rb_start min max
42 :1 0 0 0 0 42 42 42
10 :1 0 0 0 0 10 10 10 (with 42, max-min>W-1)
10 7 1 0:1 0 0 7 7 10
7 4 0 0 1 0:1 4 4 7 (with 10, max-min>W-1)
7 4 5 1 0 1 0:1 4 4 7
4 5 1 1:1 0 0 1 1 1 5 (with 7, max-min>W-1)
1 5 1:1 0 0 0 1 1 5 (5 is a duplicate)
5 7 :1 0 1 0 0 5 5 7 (with 1, max-min>W-1)
5 7 6 :1 1 1 0 0 5 5 7
5 7 6 8 :1 1 1 1 0 5 5 8
5 7 6 8 4 1 1 1 1:1 4 4 8 (success)
于 2012-09-02T10:02:44.123 回答