algorithm - 如何使这个最长递增子序列程序返回这个子序列
问题描述
我有这个最长增加子序列的代码。现在它返回最长增加子序列的长度,但我不知道如何让它返回这个确切的子序列。例如。在这种情况下,它应该返回 [3,6,7,8,9]。有任何想法吗?我希望不要使用非常复杂的语法:D
a = [3, 6, 7, 2, 1, 8, 9, 5]
n = len(a)
q = [0] * n
for k in range(n):
max = 0
for j in range(k):
if a[k] > a[j]:
if q[j] > max:
max = q[j]
q[k] = max + 1
return(max(q))
外循环在 a 中的所有元素之后进行迭代,内循环检查表中的元素 k 是否大于索引 0 到 k-1 中的项目多亏了 q 表,这个例子看起来像这样[1,2,3,1,1,4,5,2]
我们可以看到first element
make subsequence of length 1
,second
一个 make subsequence of length 2
(with first element),third element
makes subsequence of length 3
(带有第一个和第二个元素),fourth element
makes ,subsequence of length 1
因为没有一个先前的元素小于它,依此类推。所以基本上在每次迭代中,它都会得到以索引 k 结尾的最长递增子序列的长度
同一程序的较短版本:
for i in range(n):
for j in range(i):
if a[i] > a[j]:
q[i] = max(q[i], 1 + q[j])
解决方案
如果您已经描述了您的代码在做什么,那就太好了,但是据我所知,在每次迭代中,它都会获得以 index 结尾的最长递增子序列的长度k
。
要追溯数组中的实际索引,只需添加另一个数组previous[]
。
初始化previous = [-1] * n
.
进而
if q[j] > max:
max = q[j]
previous[k] = j
推荐阅读
- postgresql - PowerBI 直接查询连接到 PostgreSQL 错误。OLE 或 ODBC 错误:[Expression.Error] 我们无法将表达式折叠到数据源
- mongodb - Laravel-mongo 数据库
- r - xts 按日期替换某列中的值
- spring - 我可以使用单个状态映射到多个状态的 Spring 状态机吗
- java - 如何使用 ARCore 捕捉相机镜头/捕捉
- android - 无法在 Android Studio 中禁用 Instant Run 功能
- visual-c++ - 列表迭代器不可递增断言
- django - Django rest knox 基于平台设置 ttl
- c++ - 为什么condition_variable正在等待生产者-消费者的锁?C++
- linux - 如何在 Linux 服务器上渲染图形