给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
解题思路
之前没有想清楚,以为单重循环就能解决问题。后来发现不行的,要解决f(i)的问题,必须要f(1)、f(2)……、f(i-1)的问题都解决了才行,而这前i-1个问题的解决,其实是需要多加一层循环的。
还是对这个问题理解不深刻,近期多思考下其中的关键点,两周后再来重做下看看。
代码
class Solution(object):
def lengthOfLIS(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# 将f(nums,i)定义为到下表为i为止的最长上升子串,下标i其实意味着共有i+1个字符
# 将问题拆解为i个子问题,知道前面i个子序列的返回值,就能得到第i+1个序列的返回值
n=len(nums)
if not nums:
return 0
dp=[1]*n
for i in range(n):
for j in range(i):
if nums[j]<nums[i]:
dp[i]=max(dp[i],dp[j]+1)
return max(dp)