为了账号安全,请及时绑定邮箱和手机立即绑定

有效地从python列表中获取非递减子序列

有效地从python列表中获取非递减子序列

紫衣仙女 2021-11-23 20:18:34
我写了一个代码来从 python 列表中获取非递减子序列lis = [3, 6, 3, 8, 6, 4, 2, 9, 5]ind = 0newlis = []while ind < len(lis):    minele = min(lis[ind:])    newlis.append(minele)    ind = lis.index(minele) + 1print(newlis)虽然它似乎与我尝试过的测试用例一起工作得很好,但有没有更有效的方法来做到这一点,因为对于列表已经排序的情况,这段代码的最坏转换时间复杂度是 O(n^2),假设内置的 min 方法使用线性搜索。更准确地说,我想要最长的非递减子列表,并且子列表应该从列表的最小元素开始。并且通过子列表,我的意思是元素不需要在给定的原始列表(lis)中连续延伸。
查看完整描述

1 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

我几乎确信它可以在线性时间内运行。您只需要在一次扫描期间继续尝试构建最长的序列,然后像我一样将它们全部存储或保留当前最长的序列。


lis = [9, 1, 3, 8, 9, 6, 9, 8, 2, 3, 4, 5]

newlis = [[]]

minele = min(lis)

ind = lis.index(minele)

currmin = minele

seq = 0

longest = 0

longest_idx = None

while ind < len(lis):

    if lis[ind] >= currmin:

        newlis[seq].append(lis[ind])

        currmin = lis[ind]

        ind += 1

    else:

        if len(newlis[seq]) > longest:

            longest = len(newlis[seq])

            longest_idx = seq

        newlis.append([minele])

        currmin = minele

        seq += 1


if len(newlis[seq]) > longest:

    longest = len(newlis[seq])

    longest_idx = seq


print(newlis)

print(newlis[longest_idx])


查看完整回答
反对 回复 2021-11-23
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信