以下是我最大单调子序列的代码(增加或减少)。在编写代码之前我没有做过任何研究,也没有意识到这是一个常见的计算机科学问题。从我后来的研究中,似乎普遍接受的最有效的算法是O(N log N)。这些通常是动态编程类型的解决方案,目前有点过头了。
我不是算法专家,但不是以下代码O(N)?我通过每个列表两次,一次查找增加的序列,一次减少。
我也很感激任何清理它的建议..我意识到这些功能非常重复,但是我找不到一个好的方法一次性完成所有这些都没有重复第二个函数/传递。
def largest_monotonic_subsequence(lst):
def increasing(lst):
beg,end,best = 0,0,[0,0]
for i in range(len(lst)-1):
if lst[i] <= lst[i+1]:
end = i+1
if end - beg > best[1] - best[0]:
best = beg, end
else:
beg = i+1
return (best[0],best[1]+1)
def decreasing(lst):
beg,end,best = 0,0,[0,0]
for i in range(len(lst)-1):
if lst[i] >= lst[i+1]:
end = i+1
if end - beg > best[1] - best[0]:
best = beg, end
else:
beg = i+1
return (best[0],best[1]+1)
incr = increasing(lst)
decr = decreasing(lst)
return lst[slice(*max([incr,decr], key = lambda x: x[1]-x[0]))]
答案 0 :(得分:1)
您可以使用设置为+1或-1的符号arg来反转比较感
if sgn * lst[i] <= sgn * lst[i+1]: