案例教学:最长递增子序列问题

典型题目:最长递增子序列

题目描述:给定一个整数数组,找到其中最长严格递增子序列的长度。

思路:定义 dpi 为考虑前 i 个元素,以第 i 个数字结尾的最长上升子序列的长度,注意 numsi 必须被选取。

那么,从小到大计算 dp 数组的值,在计算 dpi 之前,已经计算出 dp0...i−1 的值,则状态转移方程为:

dpi = max(dpj)+1,其中 0≤j<i 且 numj<numi。

即考虑往 dp0...i−1 中最长的上升子序列后面再加一个 numsi。由于 dpj 代表 nums0...j 中以 numsj 结尾的最长上升子序列,所以如果能从 dpj 这个状态转移过来,那么 numsi 必然要大于 numsj,才能将 numsi 放在 numsj 后面以形成更长的上升子序列。

最后,整个数组的最长上升子序列即所有 dpi 中的最大值。

复制代码
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n = (int)nums.size();
        if (n == 0) {
            return 0;
        }
        vector<int> dp(n, 0);
        for (int i = 0; i < n; ++i) {
            dp[i] = 1;
            for (int j = 0; j < i; ++j) {
                if (nums[j] < nums[i]) {
                    dp[i] = max(dp[i], dp[j] + 1);
                }
            }
        }
        return *max_element(dp.begin(), dp.end());
    }
};
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(n)

好了,本文到这里就结束了,希望认真阅读全文的小伙伴,都能有所收获哦!

相关推荐
Shaoshing22 分钟前
LeetCode100 42.接雨水
java·算法·leetcode
域限奇点访客36 分钟前
用AI生成问卷的网站怎么选?看题目录入结构、题型映射和生成后的校验
算法
not coder2 小时前
一文讲通--从树到红黑树
数据结构·算法
octopus_c2 小时前
C++ 入门
开发语言·c++·算法
爱吃香菜的初学者2 小时前
八.数据结构——哈希表(1)
数据结构·散列表
ZhengEnCi2 小时前
2026年10月30日AI早报:Gemini 4 Carbon登顶、DeepSeek融资1055亿、智元机器人上岗实测
人工智能·算法
强哥聊算力2 小时前
《算力江湖·Intel帝国往事》第三集:安迪·格鲁夫的铁血时代:Intel为什么能把对手逼到墙角?
运维·人工智能·科技·算法·ai·gpu算力
Shaoshing2 小时前
LeetCode100 11. 盛最多水的容器
算法·leetcode
骑着蜗牛撵大象3273 小时前
558 万美元训出 671B 模型:DeepSeek-V3 算法与系统的协同拆解
分布式·算法·moe·deepseek-v3·mla·fp8训练
Eyfcom3 小时前
〖阶段性回顾〗物流系统架构与算法的 Day 1-5 知识图谱与实战答疑
算法·系统架构·知识图谱·物流管理系统·快递管理系统