Description
难度:中等
给你一个整数数组 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
提示:
1 <= nums.length <= 2500
-104 <= nums[i] <= 104
进阶:
你可以设计时间复杂度为 O(n2) 的解决方案吗?
你能将算法的时间复杂度降低到 O(n log(n)) 吗?
Solution
题解来自于:https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/zui-chang-shang-sheng-zi-xu-lie-dong-tai-gui-hua-2/
动态规划:
状态态定义:dp[i] 表示在数组 nums 中以 nums[i] 结尾的最长的递增子序列的长度
转移方程:设 j∈[0,i),在每轮计算 dp[i] 的值时,遍历 [0, i) 区间,做一下的判断:
- 当 nums[i] > nums[j] 时,此时 nums[i] 可以拼接到 nums[j] 之后,成、在这种情况下,最长递增子序列的长度 dp[j] + 1
- 当 nums[i] <= nums[j] 时,此时 nums[i] 无法拼接都 nums[j],跳过当前 nums[j]
- 在上述 1 的情况下,计算 dp[i] 的最大值,即为以 nums[i] 结尾的最长的递增子序列的长度,实现方式为:定义 j 来遍历区间[0, i),每轮遍历中 dp[i] = max(dp[i], dp[j]+1)
初始状态:dp数组所有元素都置为1,表示每个元素至少能单独成为一个子序列,所以长度为1
返回值:dp 列表中的最大值,即可得到全局中的最长递增子序列
复杂度分析:
时间复杂度:O(n2)
空间复杂度为:O(n)
