300. 最长递增子序列
理解最长递增子序列(LIS)是解决该问题的关键。子序列是从给定数组中按顺序选取的元素序列,例如数组 [1, 2, 3, 4, 5]
的子序列可以是 [2, 3, 4]
。需要注意的是,子序列的元素在原数组中不一定是连续的。因此,最长递增子序列就是在所有可能的递增子序列中,找出长度最长的那个。
本题是一个典型的动态规划问题,我们可以通过定义状态和状态转移方程来解决:
状态定义: dp[i]
表示以第 i
个元素为结尾的最长递增子序列的长度。
状态转移方程: 根据递增的定义,如果当前元素 nums[i]
大于之前的某个元素 nums[j]
,那么 dp[i]
可以由 dp[j]
转移而来,即 dp[i] = max(dp[j] + 1, dp[i])
。
边界条件: 每个元素本身就是一个长度为 1 的递增子序列,因此 dp[i]
的初始值应设为 1。
此外,由于最长递增子序列可能以任意元素结尾,因此在计算过程中需要维护 dp
数组的最大值作为最终结果。
代码
class Solution {
public:int lengthOfLIS(vector<int>& nums) {int cnt = 1;int n = nums.size();vector<int> dp(n + 1);for (int i = 0;i < n;i++) dp[i] = 1;for (int i = 1; i < n;i++) {for(int j = 0;j < i;j++) {if (nums[i] > nums[j]) dp[i] = max(dp[j] + 1,dp[i]);cnt = max(dp[i],cnt);}}return cnt;}
};
时间复杂度:O(n^2)
空间复杂度:O(n)