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

动态规划-376.摆动序列-力扣(LeetCode)

一、题目解析

看着题目上的解释或许有点难以理解,这里一图流

 

只要形似上图的都可以是摆动序列,如左图,且仅含一个元素和两个元素的也算摆动序列,如右图 

二、算法原理

1、状态表示

根据经验我们都是以i位置为结尾时,最长摆动子序列的长度

但是根据我们下面的题目分析,我们可以知道最后一个位置存在两种情况

f[i]表示:以i位置为结尾时,最后一个呈“上升”趋势的,最长摆动子序列

g[i]表示:一i位置为结尾时,最后一个呈“下降”趋势的,最长摆动子序列

2、状态转移方程

f[i]是以上升为结尾,所以前一个状态为下降

f[i]->长度为1时->f[i]=1

f[i]->长度大于1是->nums[j]<nums[i],j属于[0,i-1]->f[i]=max(g[j]+1,f[i])

g[i]同理,前一个状态为上升

g[i]->长度为1时->g[i]=1

g[i]->长度大于1是->nums[j]>nums[i],j属于[0,i-1]->g[i]=max(f[j]+1,g[i])

3、初始化

由于最坏的情况下,所有子序列都为1,所以可以将f、g表内的值全部初始化为1,同时也能处理部分长度为1的情况

4、填表顺序

从左往右,两个表一起填

5、返回值

f_max:f表中的最大值,g_max:g表中的最大值

需要返回两者的最大值

思考过后,去动手实践,趁热打铁,链接:376. 摆动序列 - 力扣(LeetCode)

三、代码示例

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

 

 看到最后,如果对您有所帮助,还请点赞、收藏和关注,点点关注不迷路,我们下期再见!

 

 

http://www.xdnf.cn/news/10283.html

相关文章:

  • C++学习打卡
  • AI书签管理工具开发全记录(八):Ai创建书签功能实现
  • MSMQ消息队列》》Rabbit MQ》》安装延迟插件、延迟消息
  • 3D-激光SLAM笔记
  • Rollup打包输出产物遇到的一个坑。(分享心得)
  • Redis缓存问题重点详解
  • 57、IdentityServer4概述
  • [创业之路-398]:企业战略管理案例分析-战略意图是使命、愿景可聚焦、可量化、可落地、可实现、具象化的3-5年左右的目标
  • 三步问题 --- 动态规划
  • 二叉搜索树——AVL
  • 小红书 发评论 分析 x-s x-t
  • 在win10/11下Node.js安装配置教程
  • 网络编程1_网络编程引入
  • Centos环境下安装/重装MySQL完整教程
  • [SC]SystemC在CPU/GPU验证中的应用(二)
  • 【数据结构】图的存储(邻接矩阵与邻接表)
  • Spring Data Redis 实战指南
  • Java对象克隆:从浅到深的奥秘
  • 秒杀系统—5.第二版升级优化的技术文档三
  • Brighter 的线程模型:为何专用线程驱动异步消息泵
  • Python(十四)
  • Vue-自定义指令
  • *JavaScript中的Symbol类型:唯一标识符的艺术
  • # STM32F103 PA0到PA4多路ADC采集配置和采集程序
  • SQL进阶之旅 Day 9:高级索引策略
  • sass高阶应用
  • 基于Web的濒危野生动物保护信息管理系统设计(源码+定制+开发)濒危野生动物监测与保护平台开发 面向公众参与的野生动物保护与预警信息系统
  • resubmit v1.2.0 新特性支持类级别防止重复提交
  • 深度学习总结(40)
  • 数据集笔记:SeekWorld