当前位置: 首页 > 知识库问答 >
问题:

如何使这个最长的递增子序列程序返回这个子序列

江阳夏
2023-03-14

我有一个最长递增子序列的代码。现在它返回最长的递增子序列的长度,但我不知道如何使它返回这个精确的子序列。为了前任。在这种情况下,它应该返回[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]我们可以看到,第一个元素生成长度为1的子序列,第二个元素生成长度为2的子序列(使用第一个元素),第三个元素生成长度为3的子序列(使用第一个和第二个元素),第四个元素生成长度为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])

共有1个答案

刁钧
2023-03-14

如果您描述了您的代码正在做什么,那就太好了,但据我所知,在每次迭代中,它会得到最长的递增子序列的长度,以索引k结尾。

要追溯数组中的实际索引,只需添加另一个数组previous[]

初始化previous=[-1]*n

后来呢

if q[j] > max: 
   max = q[j]
   previous[k] = j
 类似资料:
  • 我在阅读了允许K个异常的最长递增子序列后创建了这个线程。我意识到提问的人并没有真正理解这个问题,因为他指的是一个链接,该链接解决了“允许一次更改的最长递增子数组”问题。所以他得到的答案实际上与李的问题无关。 假设给定一个长度为N的数组A。查找允许K个异常的最长递增子序列。 示例:N=9,K=1 A=[3,9,4,5,8,6,1,3,7] 答案:7 说明: 最长递增子序列为:3,4,5,8(或6),

  • 给定一个列表{x_i},我想要找到从每个元素开始的最长的递增子序列,使得起始元素包含在子序列中。 最明显的方法是对每个元素执行通常的最长递增子序列算法,给出O(n^2logn)。这能打吗?

  • 在最多一个序列存在重复的情况下,可以将最长公共子序列问题转化为最长递增子序列问题。减少问题的过程说明在这里: 假设您有以下序列: 然后,创建一个整数序列S3,其中您必须将S2的每个元素的位置放在S1中(如果元素在S1中不存在,那么忽略那个元素)。在本例中: 这种方法是如何工作的?为什么这种约简解决了寻找最长公共子序列的问题?

  • 最长增子序列是我们熟知的问题,我用耐心算法给出了一个解决方案。 我曾想过先用我的算法,然后找到长度为N的第一个序列,但不知道该怎么做。 那么,如何从随机整数序列中找到第一个最长的递增子序列呢? 我的代码段: 我的代码返回:1 2 8 第一个序列是:3 6 8 另一个例子: 我的代码正确返回:1 2 3 基本上,只要第一个最长序列与最佳最长序列相同,我的代码就能工作。但是当你有一堆相同长度的最长序列

  • 你好,我的作业是:给定的整数序列,找到最长的子序列,它的元素是按递增顺序排列的。最多有k个异常,这意味着最多有k次,序列中的下一个数字小于前一个。输出应该是最长的子序列的长度。 我发现了许多查找LIS的例子,甚至一个允许有一个更改,但是我不知道如何用k个更改来检查。以下是一次更改后发布的链接:https://www.geeksforgeeks.org/lonth-increasing-subarr

  • 我为最长的递增子序列生成了以下代码: 输入:nums=[10,9,2,5,3,7,101,18] 输出:4 说明:最长的递增子序列是[2,3,7,101],因此长度为4。 有人能帮我理解这句话吗 三个点的意义是什么?正如我们所知,映射生成键值对,映射与切片一起做什么?