首先明确:dp[i]的值用来存放当以当前nums[i]为结尾的时,最长子序列个数结果
其次:将dp数组初始化为1,当nums至少有一个数时,其最长子序列个数就是1
nums = [10 9 2 5 3 7 101 18]
以10为结尾,最长子序列个数为1:dp = [1]
以9为结尾,最长子序列个数为1:dp[1 1]
以2为结尾,最长子序列个数为1:dp = [1 1 1]
以5为结尾,最长子序列个数为2:dp = [1 1 1 2]
以3为结尾,最长子序列个数为2:dp = [1 1 1 2 2]
以7为结尾,最长子序列个数为3:dp = [1 1 1 2 2 3]
以101为结尾,最长子序列个数为4:dp = [1 1 1 2 2 3 4]
以18为结尾,最长子序列个数为4:dp = [1 1 1 2 2 3 4 4]
最后:求dp数组的最大值,即为最终结果
求解以上步骤的思路:
为获取每个nums[i]的长度(也就是对应的dp[i]的值)。当执行当前nums[i]时,需要查找比当前nums[i]小的nums[j]。然后把nums[j]对应的dp[j]值中最大的那个dp[j]值+1,即为当前nums[i]的长度
class Solution(object):
def lengthOfLIS(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dp = [1] * (len(nums))
for i in range(0, len(nums)):
for j in range(0, i): # 此处不需要查找所有比当前的nums[i]小的nums[j],只需查找在nums[i]之前的小的nums[j]即可
if nums[j] < nums[i]:
dp[i] = max(dp[i], dp[j] + 1) # 与当前更长的dp[j]+1
res = 0
for i in range(0, len(dp)):
res = max(res, dp[i])
return res
if __name__ == '__main__':
nums = [10, 9, 2, 5, 3, 7, 101, 18]
Sol = Solution()
res = Solution.lengthOfLIS(Sol, nums)
print(res)