Нахождение кратчайшего подсписка> MAX - это то же самое, что нахождение кратчайшего подсписка <= MAX, где сумма подсписка превышает MAX, если добавлен элемент до или после: С <code>[1,5,1,1,3,10,5,4,2,1] и 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
.
- В противном случае двигайтесь вправо на один вправо.
В любом случае, я дам ответ Говарду.