「动态规划」如何求最长摆动子序列的长度?

376. 摆动序列icon-default.png?t=N7T8https://leetcode.cn/problems/wiggle-subsequence/description/

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。例如,[1, 7, 4, 9, 2, 5]是一个摆动序列,因为差值(6, -3, 5, -7, 3)是正负交替出现的。相反,[1, 4, 7, 2, 5]和[1, 7, 4, 5, 5]不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。子序列可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。给你一个整数数组nums,返回nums中作为摆动序列的最长子序列的长度。

  1. 输入:nums = [1,7,4,9,2,5],输出:6,解释:整个序列均为摆动序列,各元素之间的差值为(6, -3, 5, -7, 3)。
  2. 输入:nums = [1,17,5,10,13,15,10,5,16,8],输出:7,解释:这个序列包含几个长度为7摆动序列。其中一个是[1, 17, 10, 13, 10, 16, 8],各元素之间的差值为(16, -7, 3, -3, 6, -8)。
  3. 输入:nums = [1,2,3,4,5,6,7,8,9],输出:2。

提示:1 <= nums.length <= 1000,0 <= nums[i] <= 1000。

进阶:你能否用O(n)的时间复杂度完成此题?


我们用动态规划的思想来解决这个问题。

确定状态表示:根据经验和题目要求,为了方便推导状态转移方程,我们定义如下的状态表示:

  • 用f[i]表示:所有以i位置为结尾的最后呈现上升趋势的子序列中,最长的摆动序列的长度
  • 用g[i]表示:所有以i位置为结尾的最后呈现下降趋势的子序列中,最长的摆动序列的长度

推导状态转移方程:考虑f[i]。我们把以i位置为结尾的子序列分为2类:长度为1的子序列,长度大于1的子序列。如果子序列的长度是1,那么这个子序列是摆动序列。下面我们考虑长度大于1的子序列。

如果以i位置为结尾的子序列的长度大于1,我们可以继续细分为:i位置元素的前面是i - 1位置元素的子序列,i位置元素的前面是i - 2位置元素的子序列,i位置元素的前面是i - 3位置元素的子序列,……,i位置元素的前面是0位置元素的子序列。也就是说,如果子序列中,i位置元素的前面是j位置元素,那么j的范围是[0, i - 1]。

对于每一个j,如果nums[j] < nums[i],那么这个序列最后呈现上升趋势。若想要这个序列是摆动序列,就要找到以j位置为结尾的最后呈现下降趋势的摆动序列,在后面添加上nums[i],就是以i位置为结尾的最后呈现上升趋势的摆动序列。若想要这个摆动序列尽可能得长,那么以j位置为结尾的最后呈现下降趋势的摆动序列就要尽可能得长,根据状态表示,以j位置为结尾的最后呈现下降趋势的摆动序列的最长长度是g[j]。所以,以i位置为结尾的最后呈现上升趋势的摆动序列的最长长度是g[j] + 1。

我们来梳理一下。f[i]应该取:「1」和「所有的满足0 <= j < i并且nums[j] < nums[i]的j中,g[j] + 1的最大值」的较大值。为了实现这个逻辑,我们可以把f表的值全部初始化为1,接着让i > 0时的f[i]取:所有的满足0 <= j < i并且nums[j] < nums[i]的j中,g[j] + 1的最大值

同理,g[i]应该取:「1」和「所有的满足0 <= j < i并且nums[j] > nums[i]的j中,f[j] + 1的最大值」的较大值。为了实现这个逻辑,我们可以把g表的值全部初始化为1,接着让i > 0时的g[i]取:所有的满足0 <= j < i并且nums[j] > nums[i]的j中,f[j] + 1的最大值

填表顺序:根据状态转移方程,显然应从左往右同时填2个表

返回值:根据状态表示,我们应返回f表和g表的所有值中的最大值

细节问题:f表和g表的规模和nums相同,均为1 x n

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int n = nums.size();// 创建dp表vector<int> f(n, 1);auto g = f;// 填表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);}}}return max(*max_element(f.begin(), f.end()),*max_element(g.begin(), g.end()));}
};

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

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

相关文章

ONLYOFFICE 8.1全新升级,智能办公体验再升级,引领未来工作新潮流!

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ONLYOFFICE 8.1 &#x1f4d2;1. ONLYOFFICE简介&#x1f4d9;2. ONLYOFFICE特点&#x1f4d5;3. ONLYOFFICE功能⛰️PDF 文件编辑器&#x1…

PDF秒变翻页式电子画册

​在当今数字化时代&#xff0c;将PDF文档转换成翻页式电子画册是一种提升作品展示效果和传播效率的有效方式。以下是将PDF秒变翻页式电子画册的攻略&#xff0c;帮助您轻松掌握数字创作技巧。 首先&#xff0c;选择一个合适的制作工具是关键。目前市场上有多种在线平台和软件可…

保姆级 | Windows 复古风格终端样式设置

0x00 前言 前段时间有朋友询问我 Windows 终端的样式是如何设置的&#xff0c;我也进行了一些简单的回复。在之前的 Windows 11 版本中&#xff0c;系统提供了一个界面按钮&#xff0c;可以直接将终端样式设置为复古风格。然而&#xff0c;系统更新之后&#xff0c;这个按钮好像…

【51单片机基础教程】点亮led

文章目录 前言51单片机点亮LED的原理硬件部分软件部分51单片机的寄存器编程步骤proteus仿真点亮一个led 点亮多个ledproteus仿真代码 流水灯 总结 前言 单片机&#xff08;Microcontroller Unit, MCU&#xff09;是一种集成电路&#xff0c;广泛应用于各种电子产品中。作为嵌入…

音视频入门基础:H.264专题(3)——EBSP, RBSP和SODB

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

Android性能优化-内存优化

&#xff11;、为什么进行内存优化&#xff08;如果不进行内存优化&#xff09; APP运营内存限制&#xff0c;OOM导致APP崩溃 APP性能&#xff0c;流畅性&#xff0c;响应速度和体验 2、Android内存管理方式: Android系统内存分配与回收方式 APP内存限制机制 切换应用时&…

计算机网络 —— 应用层(DHCP)

计算机网络 —— 应用层&#xff08;DHCP&#xff09; 什么是DHCPDHCP工作过程DHCP DISCOVERDHCP OFFERDHCP RQUESTDHCP ACK DHCP租约机制中继代理工作原理功能与优势 我们今天来计网的DHCP&#xff1a; 什么是DHCP DHCP&#xff08;Dynamic Host Configuration Protocol&…

利用Python爬取天气数据并实现数据可视化,一个完整的Python项目案例讲解

要使用Python爬取天气数据并进行制图分析分几个步骤进行&#xff1a; 选择数据源&#xff1a;首先&#xff0c;你需要找到一个提供天气数据的API或网站。一些常见的选择包括&#xff1a;OpenWeatherMap、Weatherbit、Weather Underground等。 安装必要的库&#xff1a;你需要安…

CPsyCoun:心理咨询多轮对话自动构建及评估方法

CPsyCoun: A Report-based Multi-turn Dialogue Reconstruction and Evaluation Framework for Chinese Psychological Counseling 在大模型应用于心理咨询领域&#xff0c;目前开源的项目有&#xff1a; https://github.com/SmartFlowAI/EmoLLM &#xff08;集合&#xff0c;…

Excel 宏录制与VBA编程 —— 12、日期相关

代码1 - 获取当前时间日期信息 代码2 - 时间日期格式 代码3 - 时间日期计算 代码4 - 时间日期案例 关注 笔者 - jxd

【投稿优惠|权威主办】2024年图像、地质测绘与遥感技术国际学术会议(ICIGSRST 2024)

【投稿优惠|权威主办】2024年图像、地质测绘与遥感技术国际学术会议&#xff08;ICIGSRST 2024&#xff09; 2024 International Conference on Image, Geological Surveying and Remote Sensing Technology&#xff08;ICIGSRST 2024&#xff09; ▶会议简介 2024年图像、地质…

【总线】AXI4第五课时:信号描述

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

实用软件下载:CrossOver 2024最新安装包及详细安装教程

​根据软件大数据显示上传或者手动输入软件都非常简单&#xff0c;一般来说CrossOver会自动连接到一个Win文件共享服务器&#xff08;Samba或CIFS&#xff09;上&#xff0c;使用者能够直接在这个服务器中选择并上传软件执行文件。实际上我们可以这样讲调整CrossOver设置&#…

JBPM4 JBDL Demo

JBPM4 JBDL Demo 工作流样例&#xff0c;工作流程定义文件

【高性能计算笔记】

第1章 - 高性能计算介绍 1. 概念&#xff1a; 高性能计算(High performance computing&#xff0c;缩写HPC)&#xff1a; 指通常使用很多处理器&#xff08;作为单个机器的一部分&#xff09;或者某一集群中组织的几台计算机&#xff08;作为单个计算资源操作&#xff09;的…

比特币今天下跌2,800美元,共有$2.824 亿合约爆仓

来源:币界原创 作者:636Marx 币界网报道&#xff0c;截止0624-18:20分&#xff0c;全网共有 90,966 交易账户爆仓&#xff0c;清算金额达 2.824 亿美元。本月累计下跌-10.10%&#xff0c;约 -7,500美元。 图片来自币界网&#xff0c;了解更新资讯 今日爆仓大部分是多头仓位&am…

(一)、配置服务器的多个网卡路由,访问多个不同网络段

一、现场网络关系说明 有这么一个需要&#xff0c;服务器有三个网口&#xff0c;网口一需要访问外网&#xff0c;网口二需要访问内网1&#xff0c;网口2需要访问内网2。需要配置路由来满足该网络访问需要。 图1 现场网络关系 二、配置教程 步骤1&#xff1a; a、命令行输入…

若依-前后端分离项目学习

第一天&#xff08;6.24&#xff09; 具体参考视频 b站 楠哥教你学Java 【【开源项目学习】若依前后端分离版&#xff0c;通俗易懂&#xff0c;快速上手】 https://www.bilibili.com/video/BV1HT4y1d7oA/?share_sourcecopy_web&vd_sourcecd9334b72b49da3614a4257…

vue项目中dom拖动排序功能实现

vue项目中拖动元素改变其顺序的功能实现 实现此功能&#xff0c;我利用的是SortableJs,其官网上直接介绍其为功能强大的js拖拽库&#xff0c;只需要简单的代码即可实现dom拖拽 1.下载 npm i sortablejs 2.引入 使用时&#xff0c;我们在那个页面中使用&#xff0c;就在该vue文…

oracle报错-ORA-12638:身份证明检索失败

navicat16连接本地oracle数据库成功后&#xff0c;连接远程数据库&#xff0c;同样是oracle11g&#xff0c;确认网络、用户名、密码都没问题的情况下&#xff0c;报错ora-12638。 解决方法&#xff1a; 这是由于Oracle的认证方式使用了本地操作系统认证&#xff08;NTS&#x…