Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f04d308

Browse files
XenoBytesXMaximSmolskiy
andauthored
Create longest_increasing_subsequence_iterative.py (TheAlgorithms#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
Lines changed: 72 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /