diff --git a/dynamic_programming/longest_increasing_subsequence.py b/dynamic_programming/longest_increasing_subsequence.py index 3cb57806e06f..6d12f1c7caf0 100644 --- a/dynamic_programming/longest_increasing_subsequence.py +++ b/dynamic_programming/longest_increasing_subsequence.py @@ -4,42 +4,52 @@ 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 """ - - -def longestSub(ARRAY): # This function is recursive - - ARRAY_LENGTH = len(ARRAY) +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) 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 - - -# Some examples + return longest_subseq + -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()