Given an unsorted array of integers, find the length of longest increasing subsequence.
For example,
Given [10, 9, 2, 5, 3, 7, 101, 18]
,
The longest increasing subsequence is [2, 3, 7, 101]
, therefore the length is 4
. Note that there may be more than one LIS combination, it is only necessary for you to return the length.
Your algorithm should run in O(n2) complexity.
Follow up: Could you improve it to O(n log n) time complexity?
最长连续递增子序列,非常典型的DP题目。目前有两种解法。普通DP是O(n^2)的复杂度,还有一个使用二分优化前一个的版本是O(nlogn)(见leetcode讨论)。
使用DP解,状态f[i]为以序列i为结尾的最长递增序列的长度,转换方程为f[i]=max(f[j]+1,nums[j-1] < nums[i-1])。注意这是一个非常经典的子状态定义方法,可以大大简化算法,如果f[i]定义为序列的前i 个字符中最长递增序列的长度,则f[j]到f[i]的转换将特别麻烦。这种的代码如下:
class Solution(object): def lengthOfLIS(self, nums): """ :type nums: List[int] :rtype: int """ if not nums: return 0 res = [1]*len(nums) for i in xrange(1,len(nums)): for j in xrange(0,i): if nums[j] < nums[i]: res[i] = max(res[i],res[j]+1) return max(res)