子阵列由可以按连续序列排列的数字组成。

时间:2012-09-02 08:35:58

标签: arrays algorithm

找到长度为W的子阵列,该子阵列由可以按连续序列排列的数字组成。对于ex- {4,5,1,5,7,6,8,4,1}且W为5,输出可以是 - {5,7,6,8,4} ..

1 个答案:

答案 0 :(得分:2)

一个长度为W的连续子阵列,包含一个连续(但未排序)的序列,有三个属性可用于构建一个有效的算法:

  1. 子阵列中有W个元素。
  2. 子阵列中最大和最小数字之间的差异为W-1
  3. 子阵列中没有重复的元素。
  4. 算法应该向输入数组前进两个指针并检查这些指针之间的子数组是否满足这三个属性。

    1. 推进两个指针以保持指针之间的差异等于W。
    2. 在推进第一个指针时,将相应的数组元素放入一个集合(控制重复项)和一个最小 - 最大队列(以控制数字范围)。
    3. 如果在集合中找到重复项,则将第二个指针前进到这些重复元素中的第一个元素的位置,同时更新集合和队列。
    4. 推进第二个指针,同时最大值和最小值之间的差值保持大于W-1,从集合和队列中删除相应的元素。
    5. 当所有三个属性都为真时停止。
    6. 最小 - 最大队列可以实现为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)