查找最短子列表 > MAX 与查找最短子列表 <= MAX 相同,如果添加了之前或之后的项目,则子列表的总数超过 MAX: 使用[1,5,1,1,3,10,5,4,2,1]
and MAX=20
,[1,3,10]
是一个子列表,包括10
但自添加下一个后无效5
总共给出19 < MAX
. 第一个有效的子列表在这里[5,1,1,3,10]
。
算法:
marker
为找到的最短子列表的长度创建一个。
- 创建游标
left
和right
.
- 将两个光标设置为
N
。
left
向左移动while total(at left, ..., at N) <= MAX
或left = 0
。
- 如果
left > 0
存储n - left + 1
在marker
. 转到 6。
right
向右移动while total(at left, ..., at right) <= MAX
或right = list.size - 1
。
- 如果
right < list.size - 1
存储right - left + 1
在marker
.
- 否则:返回
list.size
。
- 循环
while left < N and right < list.size - 1
:
left
向右移动一位。
- 测试项目
at right + 1
,如果有的话。
- 如果
total + at right + 1 > MAX
存储right - left + 1
在marker
.
- 否则向右移动一个。
无论如何,我会给霍华德答案。