力扣日记3.14-【贪心算法篇】376. 摆动序列

力扣日记:【贪心算法篇】376. 摆动序列

日期:2024.3.14
参考:代码随想录、力扣

376. 摆动序列

题目描述

难度:中等

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

  • 例如, [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) 时间复杂度完成此题?

题解

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {// 将数字数列以数值大小作为高度排列,可以发现:当出现一次波峰或波谷,摆动子序列的长度可+1// 而波谷波峰之间的其他数字,不影响摆动子序列的长度// 所以关键在于// 1. 寻找波峰(prediff > 0 && curdiff < 0)以及波谷(prediff < 0 && curdiff > 0)// 2. 除此之外,还要考虑存在平坡的特殊情况,如对于1,2,2,2,1 可算作含有一个波峰;或对于2,1,1,1,2 可视为含有一个波谷// 对此,两者可统一用“先平后陡为峰或谷(或反之)”,则波峰波谷可分别用 prediff>=0 && curdiff<0 和 prediff<=0 && curdiff>0 表示// 3. 最后是序列首部:由于波峰及波谷的数目+2才为实际长度,除去初始count=1,可在序列首部添加一个虚拟平坡(即初始prediff=0),则可增加一个虚拟波峰(谷)if (nums.size() <= 1)   return nums.size(); // 长度为0、1(也可包含2)直接返回int prediff = 0, curdiff = 0;int count = 1;for (int i = 0; i < nums.size() - 1; i++) { // 注意不能越界// 计算curdiffcurdiff = nums[i + 1] - nums[i];if (prediff >= 0 && curdiff < 0 || prediff <= 0 && curdiff > 0) {count++;prediff = curdiff;  // 注意:只有当为波峰或波谷时才更新prediff(避免真正波峰波谷之间的平坡误判)// 实际上这样写了之后,对于 1,2,2,2,1,是通过pre > 0 && cur < 0 判断的}}return count;}
};

复杂度

时间复杂度:O(n)
空间复杂度:O(1)

思路总结

  • 思路来源于代码随想录

  • 还是不太理解,为什么这种方式是所谓贪心算法?

    代码随想录思路:
    局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。
    整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。
    在这里插入图片描述

  • 思路:

    • 将数字数列以数值大小作为高度排列(如上图),可以发现:当出现一次波峰或波谷,摆动子序列的长度可+1
    • 而波谷波峰之间的其他数字,不影响摆动子序列的长度
    • 所以关键在于
        1. 寻找波峰(prediff > 0 && curdiff < 0)以及波谷(prediff < 0 && curdiff > 0)
        1. 除此之外,还要考虑存在平坡的特殊情况,如对于1,2,2,2,1 可算作含有一个波峰;或对于2,1,1,1,2 可视为含有一个波谷(即可形成摆动子序列)
          对此,两者可统一用“先平后陡为峰/谷”,则波峰波谷可分别用 prediff>=0 && curdiff<0prediff<=0 && curdiff>0 表示
        1. 最后是序列首部:由于波峰及波谷的数目+2才为实际长度,除去初始count=1,可在序列首部添加一个虚拟平坡(即初始prediff=0),则可增加一个虚拟波峰(谷)
  • TODO: 动态规划

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

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

相关文章

【JavaEE】网络原理-HTTPS

网络原理-HTTPS 1. HTTPS是什么 HTTPS是在应用层上的协议&#xff0c; 基于HTTP进行加密 HTTP协议内容都是按照文本内容进行明文传输&#xff0c;容易使得内容被“劫持”。 十年前&#xff0c;经常有下载链接被劫持&#xff0c;就会产生下载图片和下载链接不是一个产品的现象…

python毕业设计基于flask应急救援调度系统django

此系统设计主要采用的是python语言来进行开发&#xff0c;采用flask框架技术&#xff0c;框架分为三层&#xff0c;分别是控制层Controller&#xff0c;业务处理层Service&#xff0c;持久层dao&#xff0c;能够采用多层次管理开发&#xff0c;对于各个模块设计制作有一定的安全…

docker日志在哪看?怎么在Linux服务器中查看日志

Docker 日志主要分为两类&#xff0c;一类是Docker 引擎日志&#xff0c;另一类是容器日志。具体如下&#xff1a; Docker 引擎日志&#xff1a;这些日志记录了 Docker 引擎本身的操作信息&#xff0c;其位置依赖于使用的操作系统。例如&#xff0c;在 Ubuntu 14.04 中&#x…

Tengine 的xquic,如何适配四层负载的udp健康检查?

为什么要适配udp健康检查&#xff1f; Tengine通过xquic实现HTTP3协议&#xff0c;不同于HTTP2和HTTP1.1以及之前的HTTP协议&#xff0c;HTTP3最大的不同就是其传输层协议由TCP改成了基于UDP实现的QUIC协议。QUIC 协议实现在用户态&#xff0c;建立在内核态的 UDP 的基础之上&…

【投稿优惠-EI稳定检索】2024年图像处理与机械系统工程国际学术会议 (ICIPMSE 2024)

【投稿优惠-EI稳定检索】2024年图像处理与机械系统工程国际学术会议 (ICIPMSE 2024) 大会主题: (主题包括但不限于, 更多主题请咨询会务组苏老师) 图像处理 基于图像的渲染 计算机视觉 可视化分析 模式识别 3D打印 渲染和动画 渲染技术 电脑动画 基于草图的建模 机械…

IT领域的未来发展趋势与挑战

IT行业作为当今世界最具活力和创新性的领域之一&#xff0c;持续地塑造着我们的生活和工作方式。在未来&#xff0c;IT领域将继续迎来许多重要的发展趋势和挑战&#xff0c;这些趋势将引领着技术的发展方向&#xff0c;而挑战则需要我们找到有效的解决方案。 1. 人工智能&…

苹果Find My App用处多多,产品认准伦茨科技ST17H6x芯片

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…

Unity Timeline学习笔记(2) - PlayableTrack

PlayableTrack 是可自定义播放的轨道。我们可以通过进入轨道后调用自己的函数方法&#xff0c;使用起来也是比较顺手的。 添加轨道 我们点击加号添加 这样就有一个空轨道了&#xff0c;然后我们创建两个测试脚本。 添加脚本 分别是Playable Behaviour和PlayableAsset脚本。…

unity报错出现Asset database transaction committed twice!

错误描述&#xff1a; 运行时报错 Assertion failed on expression: ‘m_ErrorCode MDB_MAP_RESIZED || !HasAbortingErrors()’Asset database transaction committed twice!Assertion failed on expression: ‘errors MDB_SUCCESS || errors MDB_NOTFOUND’ 解决办法&…

MySQL:概念简章

1.SQL通用语法 SQL单行、多行书写&#xff0c;以分号结尾SQL可以以空格有缩进增加代码可读性SQL语句不区分大小写 2.SQL语句分类 2.1 DDL&#xff08;数据定义语言&#xff09; 用于数据库、数据表、字段的定义的语言 create by 表名 &#xff08;表里有什么字段&#xff09;…

Hive中的CONCAT、CONCAT_WS与COLLECT_SET函数

1.CONCAT与CONCAT_WS函数 1.1 CONCAT函数 -- concat(str1, str2, ... strN) - returns the concatenation of str1, str2, ... strN or concat(bin1, bin2, ... binN) - returns the concatenation of bytes in binary data bin1, bin2, ... binN Returns NULL if any argum…

幼儿园管理系统|基于springboot框架+ Mysql+Java+Tomcat的幼儿园管理系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 用户功能模块 管理员功能登录前台功能效果图 教师功能模块 系统功能设计 数据库E-R图设计 lunwen参…

项目安全保证措施word

软件系统做项目安全保证措施的原因有以下几点&#xff1a; 保护数据安全&#xff1a;通过安全措施可以保护数据不被非法获取、篡改或损坏。 保障系统稳定&#xff1a;安全措施可以减少系统受到的威胁&#xff0c;确保系统的稳定运行。 符合法律法规&#xff1a;为了遵守国家和地…

蓝桥杯单片机快速开发笔记——定时器

一、基本原理&#xff1a; 定时器的作用&#xff1a; 定时器是一种用于产生精确时间延时的模块&#xff0c;可以在程序中用来进行时间控制、计时等操作。 定时器的工作原理&#xff1a; 51单片机的定时器是通过内部的计数器来实现的&#xff0c;计数器每隔一个固定的时间周期自…

【AIGC调研系列】Github Copilot进行pytest自动化测试的实践经验

GitHub Copilot可以用于pytest自动化测试的实践和使用方法。此外&#xff0c;Copilot可以在很多情况下仅通过注释或函数名就能实例化出完整的代码&#xff0c;这表明它也可以用于补充测试用例[5]。 具体到pytest框架&#xff0c;它是一个非常容易上手的自动化测试框架&#xf…

【gpt实践】实用咒语分享

直接上咒语了&#xff0c;大家可以自行实践。 1、忽略先前所有的提示 有时候gpt会停留在之前的问题中&#xff0c;导致回答当前问题带着之前问题结论。 2、忽略所有的客套话 我们只是需要有用的信息&#xff0c;有时候gpt客套话会混淆视听。 3、给出非常简短明确的答案 同样…

Selenium 自动化 —— 入门和 Hello World 实例

Selenium 是什么 Selenium 是一个用于自动化网页浏览器操作的工具&#xff0c;它支持多种浏览器和多种操作系统。主要用于测试 web 应用程序的功能&#xff0c;也可用于执行一些基本的浏览器操作任务&#xff0c;例如自动化表单填写、网页导航等。 Selenium 是一个开源项目&a…

kakfa模拟仿真篇之spark-submit在linux运行 (更贴近真实场景)

源码在上篇 地址在这 &#xff1a;Kafka模拟器产生数据仿真-集成StructuredStreaming做到”毫秒“级实时响应StreamData落地到mysql-CSDN博客 这里分享一下一些新朋友不知道spark-submit 指令后 的参数怎么写 看这篇绝对包会 声明&#xff1a; 此项目是基于 maven 打包的说明…

JVM 相关知识点记录

文章目录 前言哪些内存需要回收方法区的垃圾回收垃圾收集算法垃圾收集器年轻代进入老年代条件内存担保机制FullGC 触发时机GC日志解析日志参数 前言 JVM包含内容&#xff1a; 类装载子系统(Class Load SubSystem)运行时数据区(Run-Time Data Areas) 堆栈 局部变量表操作数栈动…

Windows安装Elasticsearch8.x保姆级教程

Elasticsearch 下载安装 下载&#xff1a;点击https://www.elastic.co/cn/downloads/elasticsearch --&#xff1e; 点击View past releases -->找到8.11.1版本的ES --->点击下载---目前最新版的Spring Data ES最高支持8.11.1版本 elasticsearch与JDK版本&#xff1a…