题目要求
给定一个整数数组nums,返回最长严格递增子序列的长度。
思路
动态规划,五部曲:
- 确定dp数组以及下标的含义:dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度
- 状态转移方程:位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1); 注意这里不是要dp[i] 与 dp[j] + 1进行比较,而是我们要取dp[j] + 1的最大值。
- dp[i]的初始化:dp[i]起始大小都至少是1。
- 遍历顺序:从前向后遍历
- 举例推导
11月底学完之后目前又有点忘了,这一个月经历了各种被拒绝,也去外边玩儿了一圈。要继续努力提高自己代码算法、概率论、写策略的能力。上边的推导过程是我重新学习之后边看边写的,代码如下:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> dp(nums.size()+1, 1);
if (nums.size() <= 1) return nums.size();
int result = 0;
for (int i = 1; i < nums.size(); ++i) {
for (int j = 0; j < i; ++j) {
if (nums[i] > nums[j]) {
dp[i] = max(dp[j] + 1, dp[i]);
} else {
dp[i] = dp[i];
}
if (dp[i] > result) result = dp[i];
}
}
return result;
}
};
- 时间复杂度: O(n^2)
- 空间复杂度: O(n)