当前位置: 首页 > news >正文

[Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解

目录

  • 0.子序列 vs 子数组
  • 1.最长递增子序列
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.摆动序列
    • 1.题目链接
    • 2.题目链接
    • 3.代码实现


0.子序列 vs 子数组

  • 子序列
    • 相对顺序是跟源字符串/数组是一致的
    • 但是元素和元素之间,在源字符串/数组中可以是不连续的
    • 一般时间复杂度: O ( 2 n ) O(2^n) O(2n)
  • 子数组
    • 在源字符串/数组中挑出来,必须是连续的
      • 子串与子数组是一个意思
    • 一般时间复杂度: O ( N 2 ) O(N^2) O(N2)
  • 子序列其实相当于包含了子数组
  • 子序列问题经典解法:两层循环

1.最长递增子序列

1.题目链接

  • 最长递增子序列

2.算法原理详解

  • 注意:本题思考方式非常有标志性
  • 思路
    • 确定状态表示 -> dp[i]的含义

      • i位置元素为结尾的所有子序列中,最长递增子序列的长度
    • 推导状态转移方程
      请添加图片描述

    • 初始化:vector<int> dp(n, 1)

    • 确定填表顺序:从左往右

    • 确定返回值:整个dp表里的最大值


3.代码实现

int lengthOfLIS(vector<int>& nums) 
{int n = nums.size();vector<int> dp(n, 1);int ret = 1;for(int i = 1; i < n; i++){for(int j = 0; j < i; j++){if(nums[j] < nums[i]){dp[i] = max(dp[i], dp[j] + 1);}}ret = max(ret, dp[i]);}return ret;
}

2.摆动序列

1.题目链接

  • 摆动序列

2.题目链接

  • 思路
    • 确定状态表示 -> dp[i]的含义

      • i位置元素为结尾的所有子序列中,最长的摆动序列的长度
      • 本题状态标识还可以继续划分
        • f[i]:以i位置元素为结尾的所有子序列中,最后一个位置呈现“上升”趋势的最长的摆动序列的长度
        • g[i]:以i位置元素为结尾的所有子序列中,最后一个位置呈现“下降”趋势的最长的摆动序列的长度
    • 推导状态转移方程

      • ji前面的任一一个数
        请添加图片描述
    • 初始化:vector<int> f(n, 1), g(n, 1)

    • 确定填表顺序:从左往右,两个表一起填

    • 确定返回值:两个dp表里的最大值


3.代码实现

int wiggleMaxLength(vector<int>& nums) 
{int n = nums.size();vector<int> f(n, 1), g(n, 1);int ret = 1;for(int i = 1; i < n; i++){for(int j = 0; j < i; j++){if(nums[j] < nums[i]){f[i] = max(f[i], g[j] + 1);}else if(nums[j] > nums[i]){g[i] = max(g[i], f[j] + 1);}}ret = max(ret, max(f[i], g[i]));}return ret;
}

相关文章:

  • JDK JRE JVM 三者的关系
  • CCF-GESP 2024 四级T1相似字符串
  • 多输入多输出非线性对象的模型预测控制—Matlab实现
  • K8s:Pod初识
  • aws emr启动standalone的flink集群
  • 使用 Apache Commons Exec 管理外部进程
  • 【计算机网络】——概述(图文并茂)
  • oracle中的INTERVAL函数学习总结
  • 50etf期权上市时间是什么时候?50etf期权对应的标的
  • 2022年全国职业院校技能大赛高职组“信息安全管理与评估”赛项第三阶段任务书
  • GolangFoundation
  • CSS学习笔记目录
  • 安装Lubuntu24.04
  • C# list集合
  • 卷积神经网络-奥特曼识别
  • Apache Pulsar 2.1 重磅发布
  • django开发-定时任务的使用
  • Java 内存分配及垃圾回收机制初探
  • Joomla 2.x, 3.x useful code cheatsheet
  • js面向对象
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • SegmentFault 2015 Top Rank
  • 阿里云应用高可用服务公测发布
  • 程序员该如何有效的找工作?
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于Java中分层中遇到的一些问题
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 一个SAP顾问在美国的这些年
  • 带你开发类似Pokemon Go的AR游戏
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​flutter 代码混淆
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #Linux(Source Insight安装及工程建立)
  • (C语言)球球大作战
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (转)VC++中ondraw在什么时候调用的
  • (转)项目管理杂谈-我所期望的新人
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET项目中存在多个web.config文件时的加载顺序
  • @Async注解的坑,小心
  • @我的前任是个极品 微博分析
  • [ C++ ] STL---string类的模拟实现
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [CareerCup][Google Interview] 实现一个具有get_min的Queue