求数组中最长递增子序列

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

 

posted @ 2015-01-16 09:55  jokerlu  阅读(245)  评论(0编辑  收藏  举报