zoukankan      html  css  js  c++  java
  • 求数组中最长递增子序列

    编程之美2.16

    我的解法是通过空间换时间,将子序列保存在subList中。遍历原数组时,比较当前元素cur与subList最后两个元素的大小。总共有三种情况:

    1)cur大于subList[-1],那么将cur添加到subList中。

    2)cur小于subList[-1],这里又分两个子情况讨论。

      i)如果subList中只有一个元素,那么cur取代当前元素。

      ii)如果subList中有两个元素,那么比较cur和subList[-2]的大小,如果cur>subList[-2],则cur取代subList[-1];否则不对subList处理。

    i)和ii)对subList的处理可以合并起来。

    #!/usr/bin/env python
    
    def getAscendList(data):
    
        length = len(data)
        if length==0:
            return
    
        if length==1:
            return data
    
        subList = []
        subList.append(data[0])
    
        i = 1
        while i<len(data):
            pre = subList[-1]
            cur = data[i]
            if cur>pre:
                subList.append(cur)
            elif len(subList)==1 or (len(subList)>=2 and cur>subList[-2]):
                del subList[-1]
                subList.append(cur)
            i+=1
    
        return subList
            
    
        
    
    a1 = [8, 2, 2, -3, 4, -5, 6, -7]
    a2 = [1,1,1,0,1,1]
    a3 = [0,1,1,1,1]
    a4 = [2,2,2,2,2]
    a5 = [-1, -2, -3, 1,2,3]
    print getAscendList(a1)
    print getAscendList(a2)
    print getAscendList(a3)
    print getAscendList(a4)
    print getAscendList(a5)
    
    
            
    
                

    结果

    [-3, 4, 6]
    [0, 1]
    [0, 1]
    [2]
    [-3, 1, 2, 3]
  • 相关阅读:
    linux命令(8):du命令
    linux命令(7):ipcs/ipcrm命令
    linux命令(6):tar命令
    linux命令(5):netstat命令
    linux命令(4):vmstat命令
    linux命令(3):rpm命令
    linux命令(2):grep命令
    linux命令(1):sed命令
    链表中倒数第k个节点
    链表刷题总结
  • 原文地址:https://www.cnblogs.com/lumouren009/p/4227786.html
Copyright © 2011-2022 走看看