300. 最长递增子序列
✅做题思路or感想
这种“最长递增子序列”是经典的动态规划的题,虽然我在看到的第一瞬间并没有反应过来用dp,可惜
dp数组含义
dp[i]
,以nums[i]
结尾的最大递增子序列的长度
推导公式
当 nums[i] > nums[j]
时: nums[i]
可以接在nums[j]
之后(此题要求严格递增),此情况下最长上升子序列长度为dp[j] + 1
;
if (nums[i] > nums[j]) {
dp[i] = max(dp[i], dp[j] + 1);
}
后面要注意dp[i] = max(dp[i], dp[i - 1] + 1)
中不是dp[i]
和dp[i - 1] + 1
,而是去取dp[i - 1] + 1
的最大值
初始化
因为最少的子序列的长度为1,所以一律初始化为1就好了
遍历顺序
从小推大,所以是正序
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
//dp[i],以nums[i]结尾的最大递增子序列的长度
vector<int>dp (nums.size(), 1);
int result = 1;
for (int i = 0; i < nums.size(); ++i) {
for(int j = 0; j < i; ++j) {
if (nums[i] > nums[j]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
result = max(result, dp[i]);
}
//这里return的不是dp[nums.size() - 1]!!!!
//这里要想dp数组的意义,dp[nums.size() - 1]是指nums[nums.size() - 1]为结尾的最长递增子序列,而不是全局的最长的递增子序列!所以这里要return全局的!
return result;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix