python - 最大的单调递增或递减子序列

标签 python algorithm subsequence

下面是我的最大单调子序列(增加或减少)的代码。在编写代码之前我没有做过任何研究,也不知道这是一个常见的计算机科学问题。从我随后的研究来看,似乎普遍接受的最有效算法是 O(N log N)。这些通常是动态规划类型的解决方案,此时我有点难以理解。

我不是算法专家,但下面的代码不就是O(N)吗?我遍历每个列表两次,一次查找递增序列,一次查找递减序列。

如果有任何关于清理它的建议,我也将不胜感激。我意识到这些功能非常重复,但我找不到一种很好的方法来一次性完成所有工作,而不重复第二个功能/ channel 。

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]))]

最佳答案

您可以使用一个符号参数,设置为 +1 或 -1,来反转比较的含义

if sgn * lst[i] <= sgn * lst[i+1]:

关于python - 最大的单调递增或递减子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40337207/

相关文章:

algorithm - DNA子序列动态规划问题

python - 如何在选中复选框时显示 Div

python - Discord.py 仅发送 "objects"而不是实际信息

python - 如何分配和管理优先级机制

python - 求解异或方程组的最优算法

algorithm - 如何使用后缀树在线性时间内找到这样的字符串?

c - 获得帮助递归 C 编程

c++ - 如果数字为负,为什么在递归解决方案中查找给定序列中的最大子序列的基本情况返回 0?

python - Flask - 如何获取 cookie 过期时间?

algorithm - 针对具有矩阵的极稠密图优化的 dijkstra 算法