最长上升子序列
题目描述:
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1: 输入:nums = [10,9,2,5,3,7,101,18] 输出:4 解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。 示例 2: 输入:nums = [0,1,0,3,2,3] 输出:4 示例 3: 输入:nums = [7,7,7,7,7,7,7] 输出:1
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-increasing-subsequence 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
定义dp[i] 的值代表 nums 前i个数字的最长子序列长度。 当 nums[i] > nums[j]时: nums[i]可以接在 nums[j]之后(此题要求严格递增),此情况下最长上升子序列长度为 dp[j] + 1dp[j]+1 ;计算出的 dp[j] + 1 的最大值,为直到 i的最长上升子序列长度(即 dp[i])。实现方式为遍历 j 时,每轮执行 dp[i] = max(dp[i], dp[j] + 1)。 转移方程: dp[i] = max(dp[i], dp[j] + 1) for j in [0, i)。
Python实现:
def lengthOfLIS(self, nums: List[int]) -> int:
if nums is None:
return 0
dp = []
for i in range(len(nums)):
dp.append(1)
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
|