本文最后更新于594 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
视频讲解:https://www.bilibili.com/video/BV1ng411J7xP
https://programmercarl.com/0300.%E6%9C%80%E9%95%BF%E4%B8%8A%E5%8D%87%E5%AD%90%E5%BA%8F%E5%88%97.html
1.本题一开始想的是双指针进行遍历,选出最长的递增子序列,但是本题使用动态规划的系列题目,所以就跟着卡哥的思路,本题要求求出递增子序列,dp数组的定义尤为重要,本题的dp[i]是在nums[i]之前的最大递增子序列的长度 基于此进入循环递归遍历第i个元素之前的所有值找到小于nums[i]的值dp[i] +1然后与本身取最大值。
CPP
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> dp(nums.size() + 1, 1);
if(nums.size() <= 1)return nums.size();
int res = 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[i], dp[j] + 1);
}
res = max(dp[i], res);
}
return res;
}
};