【贪心算法题记录】376. 摆动序列

题目链接

题目描述

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

例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。

相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。
子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。

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

题目分析

先理解题意错误了。。以为是像那种滑动窗口的类型,结果发现可以记录不连续的元素ORZ

这题其实不需要真的删除元素,我们统计满足摆动条件的元素就可以,也就是计算prediff (nums[i]-nums[i-1])curdiff (nums[i+1]-nums[i]),然后通过比较preDiffcurDiff的大小来判断当前趋势是否是摆动的,直接想法是:两者一个小于0,一个大于0,就是摆动的趋势。但是深入思考会发现,还有这三种情况要考虑进去:

  1. 有平坡,即相同元素挨在一起,如下图所示
    在这里插入图片描述
    我们可以规定删除前面的相同元素。
  • 对于第一个2:preDiff >0,curDiff = 0,它是不满足摆动的,所以不计入结果;
  • 对于第二个和第三个2:preDiff = 0, curDiff = 0,也不满足摆动,所以也不计入结果;
  • 对于最后一个2:preDiff = 0,curDiff < 0,它是满足摆动的,我们要将它计入结果。

通过上述分析,我们发现当满足preDiff = 0,curDiff < 0时,我们也要记录结果,所以综合起来我们判断摆动的条件就是(preDiff >= 0 && curDiff < 0) || (preDiff <= 0 && curDiff > 0)

  1. 数组首位两端,例如只有[2, 5]
    因为题目中已经说了,如果只有两个不同的元素,那么摆动序列也是2。我们可以在一开始判断数组的长度,将这种情况排除在我们写的逻辑之外。

但是如果要将其与当前逻辑融合在一起的话:

  • 首端元素:假设它前面有一个相同元素,那么它的preDiff = 0,curDiff = 3,依照我们上面规定的条件,它是满足摆动的。
  • 末尾元素:我们在判断条件的时候要依据三个元素,当我们判断到最后一个元素的时候,它后面就没有另外的元素了,那么我们就默认最后一个元素是满足的,将结果result初始化为1。

通过上面的分析,我们可以写出下面的代码(没有考虑情况3):

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if (nums.size() <= 1) return nums.size();
        int curDiff = 0; // 当前一对差值
        int preDiff = 0; // 前一对差值
        int result = 1;  // 记录峰值个数,序列默认序列最右边有一个峰值
        for (int i = 0; i < nums.size() - 1; i++) {
            curDiff = nums[i + 1] - nums[i];
            // 出现峰值
            if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) {
                result++;
            }
            preDiff = curDiff;
        }
        return result;
    }
};
  1. 单调坡中有平坡,例如[1, 2, 2, 2, 3, 4]
    在这里插入图片描述
    如果按照我们上面的思路,到第三个2的时候,就会判断此时满足摆动,所以最终结果会记录3个,但实际上这是一个非单调递减的序列,因此只有头和尾是满足摆动的。这是因为忽略了从首端的1到第一个2的趋势是增的,而在判断最后一个2时,我们没有考虑这一点。也就是说我们的preDiff并没有保留历史信息,我们要让坡度改变的时候再去更新preDiff。因此上述代码可以改进为:
class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if (nums.size() <= 1) return nums.size();
        int curDiff = 0; // 当前一对差值
        int preDiff = 0; // 前一对差值
        int result = 1;  // 记录峰值个数,序列默认序列最右边有一个峰值
        for (int i = 0; i < nums.size() - 1; i++) {
            curDiff = nums[i + 1] - nums[i];
            // 出现峰值
            if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) {
                result++;
                preDiff = curDiff; // 注意这里,只在摆动变化的时候更新prediff
            }
        }
        return result;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Qt】Qt框架文件处理精要:API解析与应用实例:QFile

文章目录 前言&#xff1a;1. Qt 文件概述2. 输入输出设备类3. 文件读写类3.1. 打开open3.2. 读read / readline/ readAll3.3. 写write3.4. 关闭close 4. 读写文件示例5. 文件件和目录信息类总结&#xff1a; 前言&#xff1a; 在现代软件开发中&#xff0c;文件操作是应用程序…

好消息!DolphinScheduler官网集成LLM模型问答AI kapa.ai

不少小伙伴可能发现了&#xff0c;Apache DolphinScheduler官网最近默默上线了kapa.ai作为LLM的问答AI。 集成kapa.ai之后&#xff0c;社区用户可以点击Apache DolphinScheduler官网首页右下角的「Ask AI」模块&#xff0c;在接下来弹出的问答框输入自己的问题&#xff0c;即可…

uniapp通过Canvas绘制网格(心电图,坐标纸等可用)

本篇文档是Canvas绘制心电图的第一个部分&#xff0c;想了解详情的可以关注后学习交流。 心电图的最底层需要一个网状底层&#xff0c;来方便进行数据的测量。 一、白底分大、中、小三个区域的网格 1、首先是HTML部分 <!DOCTYPE html> <html lang"en">…

睿联技术对亚马逊既依赖又竞争:递表前大额分红,资金充裕又补流?

《港湾商业观察》施子夫 王璐 今年3月29日&#xff0c;冲刺创业板IPO的深圳市睿联技术股份有限公司&#xff08;以下简称&#xff0c;睿联技术&#xff09;提交了注册&#xff0c;不出意外的话&#xff0c;公司离挂牌上市已经近在咫尺。 然而&#xff0c;在目前资本市场尤其…

HNU-计算机体系结构-期末复习

前言 这是新开的课程&#xff0c;故历年考题有限。2024年期末考试的情况像大默写。期末试卷回忆在这里&#xff1a; 计算机体系结构-2024期末考试-CSDN博客 不知道结果怎么样&#xff0c;希望别太对不起付出吧。 资源推荐 本着不重复造轮子的原则&#xff0c;这里推荐学长以…

大模型培训 AUTOWEBGLM:自动网页导航智能体

大语言模型&#xff08;LLMs&#xff09;在智能代理任务中发挥着重要作用&#xff0c;尤其是在网络导航方面。然而&#xff0c;现有的代理在真实世界的网页上表现不佳&#xff0c;主要原因网络导航代理面临着三大挑战&#xff1a;网页上行动的多样性、HTML文本的处理限制以及开…

127.0.0.1 和 localhost 以及 0.0.0.0 区别

之前用 nginx 的时候&#xff0c;发现用这几个 IP&#xff0c;都能正常访问到 nginx 的欢迎网页。一度认为这几个 IP 都是一样的。 但本质上还是有些区别的。 首先 localhost 就不叫 IP&#xff0c;它是一个域名&#xff0c;就跟 "baidu.com",是一个形式的东西&…

开放式耳机推荐品牌:五款品质超凡机型必须选购

在这个快节奏的生活中&#xff0c;我们每个人都渴望在忙碌之余找到一片属于自己的宁静。音乐&#xff0c;作为连接心灵的桥梁&#xff0c;无疑是最为直接和有效的途径。而一款优秀的开放式耳机&#xff0c;不仅能让我们沉浸在美妙的旋律中&#xff0c;还能在保持对外界环境感知…

汇编原理(三)编程

源程序&#xff1a; 汇编指令&#xff1a;有对应的机器码与其对应 伪指令&#xff1a;无对应的机器码&#xff0c;是由编译器来执行的指令&#xff0c;编译器根据伪指令来进行相关的编译工作。 ex1:XXX segment、XXX ends这两个是一对成对使用的伪指令&#xff0c;且必须会被用…

HNU-计算机体系结构-实验3-缓存一致性

计算机体系结构 实验3 计科210X 甘晴void 202108010XXX 文章目录 计算机体系结构 实验31 实验目的2 实验过程2.0 预备知识2.0.1 多cache一致性算法——监听法2.0.1.1 MSI协议2.0.1.2 MESI协议2.0.1.3 本题讲解 2.0.2 多cache一致性算法——目录法2.0.2.1 有中心的目录法2.0.2…

摸鱼大数据——Hive表操作——复杂类型

1、hvie的SerDe机制 其中ROW FORMAT是语法关键字&#xff0c;DELIMITED和SERDE二选其一。本次我们主要学习DELIMITED关键字相关知识点 如果使用delimited: 表示底层默认使用的Serde类:LazySimpleSerDe类来处理数据。 如果使用serde:表示指定其他的Serde类来处理数据,支持用户自…

无需安装的在线PS:打开即用

为什么想用在线PS网页版&#xff1f;Photoshop常用于平面设计&#xff0c;是不少设计师接触过的第一款设计软件。作为一款平面设计工具&#xff0c;ps功能太多&#xff0c;并且没有在线版&#xff0c;这不仅需要设计师花费时间学习软件&#xff0c;还需要设计师具备一定的设计能…

Ant Design 动态增减form表单,第二三项根据第一项选中内容动态展示内容

效果图&#xff1a; 选中第一项下拉框&#xff0c;第二第三项展示 点击添加条件&#xff0c;第二条仍然只展示第一项select框 后端返回数据格式&#xff1a; ruleList:[{name:通话时长,key:TALK_TIME,type&#xff1a;’INT‘,unitName:秒,operaObj:[{name:>,value:>…

[JAVASE] String类 StringBuffer类 StringBuilder类

目录 一.String类 1.1 String字符串不可变的原因 1.2 字符串中的比较方法 1.2.1 equals 1.2.2 compareTo 与 compareToIgnoreCase 1.3 字符串中的查找方法 1.3.1 charAt 1.3.2 indexOf 与 lastIndexOf 1.4 字符串中的转换方法 1.4.1 valueOf 1.4.2 toUpperCase 与 to…

msi安装mysql8 启动失败,提示只有在任务处于完成状态(RanToCompletion、Faulted 或 Canceled)时才能释放它。

解决方案: 1.打开服务,找到安装的mysql 2. 右击&#xff0c;打开属性&#xff0c;进入【登录】选项卡&#xff0c;选择本地系统账户。 3. 点击确定-->应用 4.服务中选择开始服务 5.服务启动成功后,在安装步骤中继续点击执行

熵值法(熵权法)

熵值法&#xff08;Entropy Method&#xff09;是一种多属性决策分析方法&#xff0c;主要用于权重确定、排序和评价。它在风险评估、资源配置、环境管理等领域得到广泛应用。熵值法的核心思想是基于信息熵的概念&#xff0c;利用信息熵来度量各属性对决策的贡献程度&#xff0…

串口环保212设备 转 profinet IO协议项目案例

1 文档说明 数采仪通过串口输出环保212的数据&#xff0c;vfbox网关通过串口采集数采仪的数据。网关把采集的数据转换成Profinet IO从站数据。 2 测试数采仪的串口数据 测试数采仪的串口有数据输出&#xff0c;并且需要知道输出的数据内容。 把数采仪的串口&#xff08;232或…

【记录】打印|无需排版,生成证件照打印PDF,打印在任意尺寸的纸上(简单无损!)

以前我打印证件照的时候&#xff0c;我总是在网上找在线证件照转换或者别的什么。但是我今天突然就琢磨了一下&#xff0c;用 PDF 打印应该也可以直接打印出来&#xff0c;然后就琢磨出来了&#xff0c;这么一条路大家可以参考一下。我觉得比在线转换成一张 a4 纸要方便的多&am…

AI视频教程下载:ChatGPT API、HTML、CSS 和 JS开发AI聊天机器人

在课程中,你将开启一段令人兴奋的聊天机器人开发之旅,并装备自己创建智能对话代理所需的技能和知识。 利用 ChatGPT API、HTML、CSS 和 JavaScript 的强大功能,你将学习如何设计和构建吸引用户并提供个性化体验的聊天机器人界面。深入探讨聊天机器人开发的基础知识,了解对话设…

给转行产品经理的小白的一些建议

哈喽我是小源&#xff0c;毕业在教培大厂做了1年的班主任&#xff0c;下午1点上班&#xff0c;被优化后gap3月找到了自己的本命岗位——产品经理&#xff01; 其实这个转变也挺机缘巧合的&#xff0c;朋友和我都是教培行业&#xff0c;她是成人职教类&#xff0c;我是k111类&a…