求数组中最长递增子序列
编程之美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]