Skip to content

Commit f04d308

Browse files
XenoBytesXMaximSmolskiy
andauthoredJan 14, 2025··
Create longest_increasing_subsequence_iterative.py (#12524)
* Create longest_increasing_subsequence_iterative.py * Update longest_increasing_subsequence_iterative.py * Update longest_increasing_subsequence_iterative.py --------- Co-authored-by: Maxim Smolskiy <mithridatus@mail.ru>
1 parent 4fe50bc commit f04d308

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
"""
2+
Author : Sanjay Muthu <https://github.com/XenoBytesX>
3+
4+
This is a pure Python implementation of Dynamic Programming solution to the longest
5+
increasing subsequence of a given sequence.
6+
7+
The problem is:
8+
Given an array, to find the longest and increasing sub-array in that given array and
9+
return it.
10+
11+
Example:
12+
``[10, 22, 9, 33, 21, 50, 41, 60, 80]`` as input will return
13+
``[10, 22, 33, 50, 60, 80]`` as output
14+
"""
15+
16+
from __future__ import annotations
17+
18+
import copy
19+
20+
21+
def longest_subsequence(array: list[int]) -> list[int]:
22+
"""
23+
Some examples
24+
25+
>>> longest_subsequence([10, 22, 9, 33, 21, 50, 41, 60, 80])
26+
[10, 22, 33, 50, 60, 80]
27+
>>> longest_subsequence([4, 8, 7, 5, 1, 12, 2, 3, 9])
28+
[1, 2, 3, 9]
29+
>>> longest_subsequence([9, 8, 7, 6, 5, 7])
30+
[7, 7]
31+
>>> longest_subsequence([28, 26, 12, 23, 35, 39])
32+
[12, 23, 35, 39]
33+
>>> longest_subsequence([1, 1, 1])
34+
[1, 1, 1]
35+
>>> longest_subsequence([])
36+
[]
37+
"""
38+
n = len(array)
39+
# The longest increasing subsequence ending at array[i]
40+
longest_increasing_subsequence = []
41+
for i in range(n):
42+
longest_increasing_subsequence.append([array[i]])
43+
44+
for i in range(1, n):
45+
for prev in range(i):
46+
# If array[prev] is less than or equal to array[i], then
47+
# longest_increasing_subsequence[prev] + array[i]
48+
# is a valid increasing subsequence
49+
50+
# longest_increasing_subsequence[i] is only set to
51+
# longest_increasing_subsequence[prev] + array[i] if the length is longer.
52+
53+
if array[prev] <= array[i] and len(
54+
longest_increasing_subsequence[prev]
55+
) + 1 > len(longest_increasing_subsequence[i]):
56+
longest_increasing_subsequence[i] = copy.copy(
57+
longest_increasing_subsequence[prev]
58+
)
59+
longest_increasing_subsequence[i].append(array[i])
60+
61+
result: list[int] = []
62+
for i in range(n):
63+
if len(longest_increasing_subsequence[i]) > len(result):
64+
result = longest_increasing_subsequence[i]
65+
66+
return result
67+
68+
69+
if __name__ == "__main__":
70+
import doctest
71+
72+
doctest.testmod()

0 commit comments

Comments
 (0)
Please sign in to comment.