包括元素N的最短子列表,总数> 1。 MIN

时间:2011-03-04 14:58:55

标签: algorithm optimization sublist

示例:

给出随机数列表[1,5,1,1,3,10,5,4,2,1],测试元素N=10 at index 5MIN=20

包含10total>20的最短子列表显然是[3,10,5,4]列表total=22size=4

问题:

以有效的方式找到这样一个子列表的算法是什么?

编辑:

  1. 可能存在满足“最短”条件的不同子列表。 [10,5,4,2][3,10,5,4]一样短,也是有效的结果。

  2. 此问题中的“子列表”是原始列表的连续项目块。 [5,10,5,4]不是有效的子列表(我将其称为子集)。

2 个答案:

答案 0 :(得分:1)

以下算法应为O(n):

从test元素开始,向左添加元素,直到sum> = min。这给出了子列表长度l的第一个猜测(从索引i开始)。没有增加长度l的子列表的起始索引i,每个步骤(直到到达您的测试元素)并且每个步骤测试是否可以将子列表缩短一个(在右边,即减小长度l)而不会小于min。

照顾边缘情况:左边的总和不够大或总和不够大。

答案 1 :(得分:0)

找到最短的子列表&gt; MAX与查找最短子列表&lt; = MAX相同,如果添加了之前或之后的项目,则子列表的总数超过MAX:[1,5,1,1,3,10,5,4,2,1]MAX=20[1,3,10]为包含10但无效的子列表,因为添加下一个5会产生总计19 < MAX。第一个有效的子列表位于[5,1,1,3,10]

算法:

  1. 为找到的最短子列表的长度创建marker
  2. 创建游标leftright
  3. 将两个游标都设置为N
  4. left移至左侧while total(at left, ..., at N) <= MAXleft = 0
    1. 如果left > 0n - left + 1存储在marker中。转到6。
  5. right移至右侧while total(at left, ..., at right) <= MAXright = list.size - 1
    1. 如果right < list.size - 1right - left + 1存储在marker
    2. 否则:返回list.size
  6. 循环while left < N and right < list.size - 1
    1. left向右移动一个。
    2. 测试项at right + 1(如果有)。
      1. 如果total + at right + 1 > MAXright - left + 1存储在marker
      2. 其他一个人右移。
  7. 无论如何,我会给霍华德答案。