LeetCode 376. 摆动序列

最长递增子序列

题目链接:

376. 摆动序列

题目描述:

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 **摆动序列 。**第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。

  • 例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。
  • 相反,[1, 4, 7, 2, 5][1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。

给你一个整数数组 nums ,返回 nums 中作为 摆动序列最长子序列的长度

题目解析

这道题目理解还是有一点困难的.我们先说一下摆动序列的定义, 下面每一个数字可以理解为两个数的差.

image-20231016211531917

如果我们数组的一个元素减去前面的一个元素构成上面这种一正一负的情况,我们把这个数组称之为摆动序列.

image-20231016211828297

算法原理

我们还是按照我们的一般的经验来解决这个问题

  • 以…为结尾

状态表示

这里我们定义下面的状态

dp[i] : 表示以i位置为结尾的我们的摆动序列的最大的长度

当时我们依照上面的来实现状态转移方程的时候,此时出现两个状态

  • 差值为 正数
  • 差值 为 负数

所以这里是多状态的.

f[i]: 表示以i位置为结尾, 我们差值为正值的摆动序列的最大长度
g[i]: 表示以i位置为结尾, 我们差值为负值的摆动序列的最大长度

状态转移方程

在进行状态转移方程的计算的时候,我们首先要计算我们的差值

1.如果差值是正数1.1 更新 f[i] = g[i-1] + 1 ,这是因为需要和前面的差值是负数打配合1.2 更新 g[i] = g[i-1]     ,g[i] 不需要变换
2.如果差值是负数2.1 更新 g[i] = f[i-1] + 1 , 和正数打配合2.2 更新 f[i] = f[i-1]
3.如果差值是03.1 更新 g[i] = g[i-1]3.2 更新 f[i] = f[i-1]

初始化

这里我们看到题目有一个很重要的说法,他说如果单独一个元素,那么我们也是摆动序列.也就是

f[0] = 1
g[0] = 1

填表顺序

从左向右填,两个表一起走.

返回值

返回我们的两个数组最后的较大值就可以了.注意,有的时候我们返回值拿一个变量保存最大值,有的时候返回我们的最后一个元素,这里我们不做记忆,可以看我们的例子来具体的使用那个.

编写代码

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

image-20231016213511637

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/107555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS笔记8_测量得到的距离单位不是米?一经度一纬度换算为多少米?

本文目录 前言Step 1 遇到测量结果以度为单位的情况Step 2 简单的笨办法转换为以米为单位Step 3 拓展&#xff1a;一经度一纬度换算为多少米 前言 有时我们会遇到这种情况&#xff0c;想在ArcGIS中使用测量工具测量一下某一段距离&#xff0c;但显示的测量结果却是某某度&…

acwing算法基础之数据结构--双链表

目录 1 知识点2 模板 1 知识点 一般的结构体写法为&#xff0c; struct BiListNode {int val;BiListNode *left;BiListNode *right; };但我们不用这个&#xff0c;而用数组模拟双链表&#xff0c;此时&#xff0c;用编号为0的结点表示头结点&#xff0c;用编号为1的结点表示尾…

AndroidStudio使用superSUAPK ROOT(失败)

下载superSUAPK Chainfire SuperSU Download - Official Download Page 两个文件&#xff1a; supersu-2-82.apk SuperSU-v2.82-201705271822.zip 查看有哪些模拟器 > cd C:\Users\Administrator\AppData\Local\Android\Sdk\emulator> .\emulator.exe -list-avds …

《设计模式巩固学习》

昨天面试完字节后发现自己的《设计模式》学习不到位 好的软件设计注重的是复用&#xff0c;而变化是复用的天敌 设计模式的章节目录&#xff08;23钟设计模式&#xff09; 一、重新认识面向对象1、重新认识面向对象2、面向对象设计基本原则&#xff08;八个原则&#xff09;3…

雷电模拟器上使用第一个frida(四)第一个HOOK

经过上述三篇&#xff0c;已经可以使用python3.8.10编写代码&#xff0c;利用frida14.2.18和雷电模拟器9.0.60(9)&#xff0c;Android 9交互。 雷电模拟器上使用第一个frida&#xff08;一&#xff09;之安装-CSDN博客 雷电模拟器上使用第一个frida&#xff08;二&#xff09…

大数据Doris(十一):添加FS_BROKER步骤

文章目录 添加FS_BROKER步骤 一、 ​​​​​​​配置broker节点

机器学习(22)---信息熵、纯度、条件熵、信息增益

文章目录 1、信息熵2、信息增益3、例题分析 1、信息熵 1. 信息熵(information entropy)是度量样本集合纯度最常用的一种指标。信息的混乱程度越大&#xff0c;不确定性越大&#xff0c;信息熵越大&#xff1b;对于纯度&#xff0c;就是信息熵越大&#xff0c;纯度越低。 2. 纯度…

Spark工作流程

Spark 的整个工作流程可以概括为以下步骤&#xff1a; 创建 SparkSession&#xff1a; 应用程序首先需要创建一个 SparkSession 对象&#xff0c;它是与 Spark 的交互入口。SparkSession 提供了对核心功能和各个模块的访问。 加载数据&#xff1a; 使用 SparkSession 提供的 AP…

Python 中的模糊字符串匹配

文章目录 Python中使用thefuzz模块匹配模糊字符串使用process模块高效地使用模糊字符串匹配今天,我们将学习如何使用 thefuzz 库,它允许我们在 python 中进行模糊字符串匹配。 此外,我们将学习如何使用 process 模块,该模块允许我们借助模糊字符串逻辑有效地匹配或提取字符…

MySQL锁学习笔记

锁 事务的隔离性由锁来实现。 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题&#xff0c;当多个线程并发访问某个数据的时候&#xff0c;尤其是针对一些敏感的数据&#xff08;比如订单、金额等&#xff09;&#xff0c;我…

论文阅读之【Is GPT-4 a Good Data Analyst?(GPT-4是否是一位好的数据分析师)】

文章目录 论文阅读之【Is GPT-4 a Good Data Analyst?&#xff08;GPT-4是否是一位好的数据分析师&#xff09;】背景&#xff1a;数据分析师工作范围基于GPT-4的端到端数据分析框架将GPT-4作为数据分析师的框架的流程图 实验分析评估指标表1&#xff1a;GPT-4性能表现表2&…

工序解释执行程序--工程师的成长

多年前一个项目主要做一台机器&#xff0c;读取文件数据并解释执行&#xff0c;吸合电磁阀或点亮相应的LED&#xff0c;提示工人操作 文件格式 A 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10 11 11 …

Qt编程,TCP编程、数据库

目录 1、TCP: QTcpServer | QTcpSocket 1、 ##TCP客户端 1、//连接成功信号 2、//连接断连信号 3、 //数据就绪信号 4、 //连接到服务器,使用服务器的IP地址和端口 5、//发送数据到服务器 6、//从服务器接收数据 2、##TCP服务器端 1、//创建TCP服务器对象 2、//新连接信号 3、…

linux之shell记录

shell属于一种很容易学习的程序设计语言&#xff0c;依赖于功能强大的命令可以编写提高开发效率的脚本。这里记录一下常用的shell相关的知识点。 持续更新中。。。 1、在linux或mac中查看使用的shell echo $SHELL /bin/bashshell是一种脚本语言&#xff0c;就会有解释器来执行…

Spring中注入的使用

目录 一、什么是注入&#xff08;Injection&#xff09; 1.1 为什么要注入 二、注入的基本使用 三、Spring注入原理分析 一、什么是注入&#xff08;Injection&#xff09; 注入就是通过Spring的配置文件&#xff0c;为所创建对象的成员变量进行赋值 1.1 为什么要注入 书接上…

Java 中实现单例模式

单例模式 单例模式&#xff0c;就是一个类在任何情况下绝对只有一个实例&#xff0c;并且提供一个全局访问点来获取该实例。 要实现单例&#xff0c;至少需要满足两个点&#xff1a; 私有化构造方法&#xff0c;防止被外部实例化造成多实例问题 提供一个静态方位作为全局访问点…

Linux:进程控制

目录 一、进程创建 写时拷贝 二、进程终止 echo $? 如何终止进程 _exit与exit 三、进程等待 进程等待的必要性 进程等待的操作 wait waitpid status 异常退出情况 status相关宏 options 四、进程程序替换 1、关于进程程序替换 2、如何进行进程程序替换 程序…

函数防抖(javaScript)

防抖说明 &#xff08;1&#xff09;防抖的目的&#xff1a; 当多次执行某一个动作的时候&#xff0c;限制函数调用的次数&#xff0c;节约资源。 &#xff08;2&#xff09;防抖的概念&#xff1a; 函数防抖&#xff08;debounce&#xff09;&#xff1a;就是指触发事件后&…

Python中图像相似性度量方法汇总

1. 引言 在当前到处充满着图像的世界里&#xff0c;测量和量化图像之间的相似性已经成为一项关键的任务。无论是图像检索、内容推荐还是视觉搜索&#xff0c;图像相似性方法在现代计算机视觉的应用中都发挥着关键的作用。 幸运的是&#xff0c;Python提供了大量的工具和库&am…

想要精通算法和SQL的成长之路 - 分割数组的最大值

想要精通算法和SQL的成长之路 - 分割数组的最大值 前言一. 分割数组的最大值1.1 二分法 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 分割数组的最大值 原题链接 首先面对这个题目&#xff0c;我们可以捕获几个关键词&#xff1a; 非负整数。非空连续子数组。 那么我…