15.4-5设计一个O(n²)时间的算法,求一个n个数的序列的最长单调递增子序列。
第一种:对序列进行排序,排序之后得到序列b与原来的序列a,求最长公共子串。(排序之前先将原来序列中的重复元素删掉(保证公共子串递增)b中无重复元素,a保持原来不变)
第二种:
def longestIncreasingSubsequence(self, nums):
# write your code here
l=[0]*(len(nums)+1)
l[0]=0
for i in range(0,len(nums)):
l[i+1]=1
for j in range(0,i):
if nums[j]<nums[i] and l[j+1]+1>l[i+1] :
l[i+1]=l[j+1]+1
max=l[0]
for i in range(1,len(l)):
if l[i]>max:
max=l[i]
return max
动态规划:length数组存最长上升子序列的长度,length[i]表示以 原始数组nums[i]为子序列最右元素时 的最长上升子序列长度(涵盖所有可能)。当原始序列长度为0时,length[0]=0. 当原始序列长度为1时,length[1]=1.对于nums[2...n]中的nums[i],每个最大上升子序列长度 ,至少为1(只有自己),所以初始化为1.对于前面的每个元素nums[j],若该值小于nums[i],那么length[i]等于length[j]+1.遍历前面的所有数,即可得到最大的length[i].
最后可求得所有的length[i].取其中最大者即可。
参考 http://blog.csdn.net/zhangyx_xyz/article/details/50949957
http://blog.csdn.net/z84616995z/article/details/38011391