求数组中最长递增子序列

编程之美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]

 

转载于:https://www.cnblogs.com/lumouren009/p/4227786.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值