找到长度为W的子阵列,该子阵列由可以按连续序列排列的数字组成。对于ex- {4,5,1,5,7,6,8,4,1}且W为5,输出可以是 - {5,7,6,8,4} ..
答案 0 :(得分:2)
一个长度为W的连续子阵列,包含一个连续(但未排序)的序列,有三个属性可用于构建一个有效的算法:
W-1
。算法应该向输入数组前进两个指针并检查这些指针之间的子数组是否满足这三个属性。
W-1
,从集合和队列中删除相应的元素。最小 - 最大队列可以实现为this answer中描述的一对最小 - 最大堆栈。一组可以实现为散列集(给出算法的O(n)预期复杂度),或者作为二叉搜索树(给出O(n log(n))最坏情况复杂度),或者作为a的组合。 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)