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

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

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

思路:定义 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)

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

相关推荐
yi0116 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
灯澜忆梦8 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
禾小西9 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
小蒋观天下9 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J9 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛9 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有10 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu11111110 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS10 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b10 小时前
算法日常・每日刷题--<动态规划>14
算法