我写了一个代码来从python列表中获得非递减子序列
lis = [3, 6, 3, 8, 6, 4, 2, 9, 5]
ind = 0
newlis = []
while ind < len(lis):
minele = min(lis[ind:])
newlis.append(minele)
ind = lis.index(minele) + 1
print(newlis)
尽管我尝试使用的测试用例似乎运行良好,但是有没有一种更有效的方法来执行此操作,因为对于已排序列表的情况,此代码的最差转换时间复杂度为O(n ^ 2) ,假设内置的min方法使用线性搜索。
更准确地说,我想要尽可能长的非递减子列表,并且子列表应以列表的最小元素开头。通过子列表,我的意思是元素不必在给定的原始列表(lis)中处于连续延伸的状态。
答案 0 :(得分:0)
我几乎相信它可以在线性时间内运行。您只需要在一次扫描期间尝试建立最长的序列,然后像我一样存储所有序列,或者保持当前最长的序列即可。
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])