【问题标题】:Error in Longest Increasing Subsequence in PythonPython中最长递增子序列的错误
【发布时间】:2018-09-30 08:18:10
【问题描述】:

我正在尝试在 Python by refering the video here 中实现最长递增子序列。

我认为我做得对。代码的空运行对我来说也很好。但是输出不正确。

d = [3, 2, 6, 4, 5, 1]
l = []
l.append([d[0]])

for i in range(1, len(d)):
    l.append([])
    for j in range(0, i):
        if d[j] < d[i] and len(l[i]) < len(l[j]) + 1:
            l[i] = l[j]
    l[i].append(d[i])

print(l)

预期输出:[[3], [2], [2, 6], [2, 4], [2, 4, 5], [1]]

实际输出:[[3], [2, 6, 4, 5], [2, 6, 4, 5], [2, 6, 4, 5], [2, 6, 4, 5], [1]]

任何帮助将不胜感激!

【问题讨论】:

  • 预期的输出是什么,你得到的输出是什么?
  • 我的错。应该提到这一点。已编辑问题。
  • 为什么[3, 6][3, 4][3, 5][3, 4, 5][2, 5][4, 5] 不在您的预期输出中?
  • 动态规划新手。链接说:L[i] 包含以 D[i] 结尾的最长递增子序列
  • @blhsing 阅读网站上的定义。 LIS 搜索以 D[i] 值结尾的最长升序子序列

标签: python python-3.x dynamic-programming


【解决方案1】:

这只是另一个引用问题。

for i in range(1, len(d)):
    l.append([])
    for j in range(0, i):
        if d[j] < d[i] and len(l[i]) < len(l[j]) + 1:
            l[i] = l[j]
    l[i].append(d[i])

注意l[i] = l[j] 行,它使l[i]l[j] 具有相同的列表,因此当您稍后修改l[i] 时,l[j] 也会被修改。你可能想要一份在这里:

l[i] = l[j][:]
l[i] = list(l[j])
l[i] = l[j].copy()  # Python 3.3 or up

这 3 行是等价的,所以选择你喜欢的。

【讨论】:

  • 少数测试用例在 Hackerrank 上超时。是因为抄的时间长吗?
  • @DeepBodra 当然。您需要优化代码(以其他方式)。
  • 非常感谢您的帮助。哦!编码太难了!发现用“:”复制是最快的复制方式。看来我将不得不寻找更有效的算法
  • @DeepBodra 是的。您可能不应该复制列表。您想改为“创建有关先前列表的信息”并在最后重建列表。
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
相关资源
最近更新 更多