Python/dynamic_programming/longest_increasing_subsequence.py

56 lines
1.7 KiB
Python
Raw Normal View History

2019-10-05 05:14:13 +00:00
"""
Author : Mehdi ALAOUI
This is a pure Python implementation of Dynamic Programming solution to the longest increasing subsequence of a given sequence.
The problem is :
Given an array, to find the longest and increasing sub-array in that given array and return it.
Example: [10, 22, 9, 33, 21, 50, 41, 60, 80] as input will return [10, 22, 33, 41, 60, 80] as output
2019-10-05 05:14:13 +00:00
"""
from typing import List
def longest_subsequence(array: List[int]) -> List[int]: # This function is recursive
"""
Some examples
>>> longest_subsequence([10, 22, 9, 33, 21, 50, 41, 60, 80])
[10, 22, 33, 41, 60, 80]
>>> longest_subsequence([4, 8, 7, 5, 1, 12, 2, 3, 9])
[1, 2, 3, 9]
>>> longest_subsequence([9, 8, 7, 6, 5, 7])
[8]
>>> longest_subsequence([1, 1, 1])
[1, 1, 1]
"""
array_length = len(array)
2019-10-05 05:14:13 +00:00
if (
array_length <= 1
2019-10-05 05:14:13 +00:00
): # If the array contains only one element, we return it (it's the stop condition of recursion)
return array
2019-10-05 05:14:13 +00:00
# Else
pivot = array[0]
2019-10-05 05:14:13 +00:00
isFound = False
i = 1
longest_subseq = []
while not isFound and i < array_length:
if array[i] < pivot:
2019-10-05 05:14:13 +00:00
isFound = True
temp_array = [element for element in array[i:] if element >= array[i]]
temp_array = longest_subsequence(temp_array)
if len(temp_array) > len(longest_subseq):
longest_subseq = temp_array
2019-10-05 05:14:13 +00:00
else:
i += 1
temp_array = [element for element in array[1:] if element >= pivot]
temp_array = [pivot] + longest_subsequence(temp_array)
if len(temp_array) > len(longest_subseq):
return temp_array
2019-10-05 05:14:13 +00:00
else:
return longest_subseq
2019-10-05 05:14:13 +00:00
if __name__ == "__main__":
import doctest
doctest.testmod()