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

本文主要是介绍[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;
}

这篇关于[Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1018957

相关文章

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo