mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-01-30 22:23:42 +00:00
Doctest and typing for longest_increasing_subsequence.py (#1526)
* Update longest_increasing_subsequence.py * Update longest_increasing_subsequence.py * Format longest_increasing_subsequence.py to PEP8 * Update longest_increasing_subsequence.py
This commit is contained in:
parent
5452e94528
commit
a9d5378ce2
|
@ -4,42 +4,52 @@ 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.
|
||||
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
|
||||
"""
|
||||
from typing import List
|
||||
|
||||
|
||||
def longestSub(ARRAY): # This function is recursive
|
||||
|
||||
ARRAY_LENGTH = len(ARRAY)
|
||||
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)
|
||||
if (
|
||||
ARRAY_LENGTH <= 1
|
||||
array_length <= 1
|
||||
): # If the array contains only one element, we return it (it's the stop condition of recursion)
|
||||
return ARRAY
|
||||
return array
|
||||
# Else
|
||||
PIVOT = ARRAY[0]
|
||||
pivot = array[0]
|
||||
isFound = False
|
||||
i = 1
|
||||
LONGEST_SUB = []
|
||||
while not isFound and i < ARRAY_LENGTH:
|
||||
if ARRAY[i] < PIVOT:
|
||||
longest_subseq = []
|
||||
while not isFound and i < array_length:
|
||||
if array[i] < pivot:
|
||||
isFound = True
|
||||
TEMPORARY_ARRAY = [element for element in ARRAY[i:] if element >= ARRAY[i]]
|
||||
TEMPORARY_ARRAY = longestSub(TEMPORARY_ARRAY)
|
||||
if len(TEMPORARY_ARRAY) > len(LONGEST_SUB):
|
||||
LONGEST_SUB = TEMPORARY_ARRAY
|
||||
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
|
||||
else:
|
||||
i += 1
|
||||
|
||||
TEMPORARY_ARRAY = [element for element in ARRAY[1:] if element >= PIVOT]
|
||||
TEMPORARY_ARRAY = [PIVOT] + longestSub(TEMPORARY_ARRAY)
|
||||
if len(TEMPORARY_ARRAY) > len(LONGEST_SUB):
|
||||
return TEMPORARY_ARRAY
|
||||
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
|
||||
else:
|
||||
return LONGEST_SUB
|
||||
return longest_subseq
|
||||
|
||||
|
||||
|
||||
# Some examples
|
||||
|
||||
print(longestSub([4, 8, 7, 5, 1, 12, 2, 3, 9]))
|
||||
print(longestSub([9, 8, 7, 6, 5, 7]))
|
||||
if __name__ == "__main__":
|
||||
import doctest
|
||||
doctest.testmod()
|
||||
|
|
Loading…
Reference in New Issue
Block a user