Я работаю над решением проблемы увеличения подпоследовательности. Алгоритм, который я придумал, в настоящее время решает только для отсортированных массивов. Я пишу свой код в python 3.5. Эта проблема размещена на Leetcode.Как улучшить алгоритм увеличения подзаследований для включения не отсортированного массива?
При увеличении проблемы подпоследовательности, мне дает целочисленный массив, задача состоит в том, чтобы найти все различные возможные возрастающие подпоследовательности данного массива, а длина возрастающей подпоследовательности должна быть по крайней мере 2.
Пример :
Вход- [4,6,7,7]
Выход - [[4,6], [4,7], [4,6,7], [4,6,7, 7], [6,7], [6,7,7], [7,7], [4,7,7]]
Это мой рабочий код для решения вопроса:
array = [4,6,7,7]
def incrSubseq(array): #Only works for sorted arrays.
res = [[]]
ans = []
for num in array:
res += [item + [num] for item in res if (item+[num] not in res)]
for values in res:
if len(values)>1:
ans = ans + [values]
print(ans)
incrSubseq(array)
Как работает этот код?
- Он начинается с инициализации переменной результат
res
(список списков) который инициализируется пустым списком. - Затем я перебираю заданный массив целых чисел
array
, который находится в отсортированном порядке, добавляя каждый элемент в список, таким образом, можно найти все подмножества, которые могут быть сформированы. Операторif
внутри распознавания списка отфильтровывает элементы, дублирующие и сохраняя при этом только одну копию списка. - Тогда я фильтровать весь массив, который имеет длину больше 1.
Таким образом, решение проблемы.
Теперь, что мне не хватает, это способ решить проблему для несортированного массива. Насколько я понимаю, мне нужно поставить проверку таким образом, что, когда я пытаюсь добавить элемент в res
, он должен быть больше или равен элементу перед ним.
res += [item + [num] for item in res if (item+[num] not in res) and (item <= num)]
который дает в пустых списках.
Любые предложения по улучшению кода?
Можете ли вы объяснить немного о том, как 'LEN (пункт) == 0 'меняет все. Я не совсем понял короткое замыкание. – Prerit
Также мой код не оптимизирован. 'array = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]' займет много времени. Поскольку я генерирую все подмножества, это будет экспоненциальный код сложности. O (n^n) Я полагаю. – Prerit
@Prerit обновил мой ответ. – Hannes