Reputation: 138
could someone tell me what's wrong with the following algorithm to find the longest increasing subsequence in a sequence of integers:
def longest_increasing_subsequence(sequence):
"""
Examples:
>>> longest_increasing_subsequence([])
[]
>>> longest_increasing_subsequence([1])
[1]
>>> longest_increasing_subsequence([1, 2])
[1, 2]
>>> longest_increasing_subsequence([2, 1])
[1]
>>> longest_increasing_subsequence([1, 2, 3])
[1, 2, 3]
>>> longest_increasing_subsequence([3, 1, 2])
[1, 2]
>>> longest_increasing_subsequence([5, 1, 3, 2, 6])
[1, 2, 6]
>>> longest_increasing_subsequence([1, 6, 3, 5, 9, 7])
[1, 3, 5, 7]
>>> longest_increasing_subsequence([3, 1, 2, 4, 6])
[1, 2, 4, 6]
>>> longest_increasing_subsequence([0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15])
[0, 4, 6, 9, 11, 15]
>>> longest_increasing_subsequence([1, 10, 2, 9, 3, 8, 4, 7, 5, 6])
[1, 2, 3, 4, 5, 6]
"""
if not sequence:
return []
result = [sequence[0]]
for i in sequence[1:]:
if i < result[0]:
result = [i]
elif i > result[-1]:
result.append(i)
elif len(result) >= 2 and i > result[-2]:
result[-1] = i
return result
Do you find a counter-example that makes it return a wrong result?
Upvotes: 0
Views: 128
Reputation: 2015
The problem with your logic is that you assume the longest increasing subsequence begins with the lowest number. This is a fallacy as shown in:
>>> longest_increasing_subsequence([2, 3, 4, 5, 6, 1])
[1]
Upvotes: 3