摆动序列(力扣376)

news2024/12/25 9:21:33

文章目录

  • 题目
  • 前知
  • 题解
    • 一、思路
    • 二、解题方法
    • 三、Code
  • 总结


在这里插入图片描述

题目

Problem: 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

前知

力扣(LeetCode)第376道题目是“摆动序列”(Wiggle Subsequence),属于动态规划和贪心算法的类型。这道题的要求是找到给定整数序列中最长的摆动子序列的长度。摆动序列是指相邻元素之间的差异在正负之间交替变化。


题解

一、思路

要想得到最大摆动序列的话,只要将单调坡上的结点删除,保留两端的结点,这个坡度就有两个峰值,是局部最优,由局部最优推出全局最优,由于题目只要求返回最大摆动序列的长度,用result变量统计,不用删除结点,用后一个值减去前一个值,得到前prediffcurdiff的值大小,如果prediff < 0 && curdiff > 0 或者 prediff > 0 && curdiff < 0 则可以确定存在峰值需要result++
,还有三种特殊情况在下面的解题方法还需要考虑一下

在这里插入图片描述

二、解题方法

本题大概代码是下面这样的:

//只有一个就返回摆动序列长度为1
if (nums.length <= 1) {
    return nums.length;
}
//计数
int result = 1;

for (int i = 1; i < nums.length; i++) {
     //得到当前差值
     int curDiff = nums[i] - nums[i - 1];
     //如果当前差值和上一个差值为一正一负,出现波动就统计
     if ((prediff < 0 && curdiff > 0) || (prediff > 0 && curdiff < 0)) {
          result++;
     }
     preDiff = curDiff;
}
return count;

三种特殊情况:

  1. 上下坡中有平坡:统一删除靠近左边平坡的点,到最后一个结点时的情况是prediff = 0 && curdiff < 0也要进行记录,所以左边的prediff都要加上与0判断相等的情况
if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0))

image.png

  1. 数组首尾两端:当数组只有两个结点时,无法计算出prediffcurdiff,让左边prediff初始为0,这样三个点会根据情况1自动删除左面的一个结点,统计result加1为2,result初始为1,因为nums数组至少都有一个元素,也就是摆动序列长度为1
//当前差值
int curDiff = 0;
//上一个差值
int preDiff = 0;

image.png

  1. 单调坡中有平坡:prediff不能每走一步都进行更新,要等出现波动时,再让prediff等于curdiff。
    在下图中实际上只有数组首尾的1,4是摆动序列里的,result应该为2,但是在平坡的最后一个2的地方因为每走一步prediff都更新下一步的,所以在2的地方也计算了一个波动,只要把prediff更新操作放到if判断里面即可
if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) {
     count++;
     preDiff = curDiff;  // 注意这里,只在摆动变化的时候更新prediff
}

image.png

三、Code

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if (nums.length <= 1) {
            return nums.length;
        }
        //当前差值
        int curDiff = 0;
        //上一个差值
        int preDiff = 0;
        int count = 1;
        for (int i = 1; i < nums.length; i++) {
            //得到当前差值
            curDiff = nums[i] - nums[i - 1];
            //如果当前差值和上一个差值为一正一负
            //等于0的情况表示初始时的preDiff
            if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) {
                count++;
                preDiff = curDiff;
            }
        }
        return count;
    }
}

总结

以上就是针对这道题的刷题笔记,用到了贪心算法从单调坡度上删除中间的结点保留两端的局部最优解推导出整个序列具有最多的局部峰值,达到最长摆动序列,希望这篇题解能够帮助到你解决这个问题。如果有任何疑问或者建议,欢迎留言讨论🌹

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

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

相关文章

《web应用技术》第二次课后练习

练习目的&#xff1a; 1、form表单值的获取 2、mysql数据库及表的建立&#xff08;参见视频&#xff09; 3、maven项目的建立&#xff08;参见视频&#xff09; 4、使用jdbc进行数据库的增删改查操作。&#xff08;参见源代码&#xff09; 具体如下&#xff1a; 1、继续理…

mysql dublewrite 双写缓存机制

mysql dublewrite 双写缓存机制&#xff0c;像不像主板双bois系统&#xff0c; 在MySQL的InnoDB存储引擎中&#xff0c;当进行数据写操作时&#xff0c;会先将数据写入到内存中的缓冲池&#xff08;Buffer Pool&#xff09;&#xff0c;然后异步刷新到磁盘上的数据文件。为了提…

怎么在UE过场动画中加入振动效果

我们已经学会了怎么在游戏中加入振动效果&#xff0c;比较典型的交互场景如&#xff1a;在开枪时让手柄同步振动&#xff0c;实现起来真的很简单&#xff0c;就是定义场景和事件&#xff0c;然后在游戏事件发生时播放特定的振动资源文件&#xff0c;跟播放音效是极其相似的&…

如何把学浪app的视频保存本地

如何把学浪app里面的视频保存到本地&#xff0c;其实很简单&#xff0c;只需要用到一个工具&#xff0c;那就是小浪助手.exe 这里我已经把小浪助手.exe打包好了&#xff0c;有需要得话自己下载 链接&#xff1a;https://pan.baidu.com/s/1y7vcqILToULrYApxfEzj_Q?pwdkqvj 提…

客户银行主数据批导

程序&#xff1a;ZSDR0005 *&---------------------------------------------------------------------* *& Report ZSDR0005 *&---------------------------------------------------------------------* *& *&----------------------------------------…

深入研究:我国工业实时操作系统的核心技术与演进路径

实时操作系统&#xff08;RTOS&#xff09;在各类工业场景中发挥着中枢神经系统的关键作用&#xff0c;是数字化工业的重要基础。当前&#xff0c;全球大部分工业实时操作系统市场被国外厂商占据&#xff0c;围绕主流RTOS产品内核提供了完备的上下游软件配套&#xff0c;并以嵌…

目标检测标签分配策略,难样本挖掘策略

在目标检测任务中&#xff0c;样本的划分对于模型的性能具有至关重要的影响。其中&#xff0c;正样本指的是包含目标物体的图像或区域&#xff0c;而负样本则是不包含目标物体的图像或区域。然而&#xff0c;在负样本中&#xff0c;有一部分样本由于其与正样本在特征上的相似性…

开启虚拟机时出现此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态怎么解决

问题描述 虚拟机安装完成后&#xff0c;点击开启此虚拟机弹出系统提示 原因分析&#xff1a; Intel VT-x 处于禁用状态&#xff0c;需要开启。 解决方案&#xff1a; 以联系小新笔记本电脑为例&#xff0c;进入BIOS界面&#xff0c;将Intel Virtual Technology设置成Enabl…

在不同操作系统中搭建Python编程环境

1 在不同操作系统中搭建Python编程环境 1.1 在Linux系统中搭建Python编程环境 1. 检查Python版本 在你的系统中运行应用程序Terminal&#xff08;如果你使用的是Ubuntu&#xff0c;可按Ctrl Alt T&#xff09;&#xff0c;打开一个终端窗口。为确定是否安装了Python&…

SpringBoot实现邮箱验证

目录 1、开启邮箱IMAP/SMTP服务&#xff0c;获取授权码 2、相关代码 1、使用配置Redis&#xff08;用于存储验证码&#xff0c;具有时效性&#xff09; 2、邮箱依赖和hutool&#xff08;用于随机生成验证码&#xff09; 3、配置Redis和邮箱信息 4、开启Redis服务 5、编写发送…

广东智慧公厕管理系统哪家好@光明源

随着城市发展和人民生活水平的提高&#xff0c;智慧公厕作为城市公共卫生设施的重要组成部分&#xff0c;受到了越来越多城市管理者的重视。在广东&#xff0c;智慧公厕管理系统的选择成为了一个备受关注的话题。那么&#xff0c;在广东&#xff0c;到底哪家智慧公厕管理系统比…

某程旅行安全工程师一面

一、自我介绍 阿吧阿吧&#xff0c;不多说了 二、两段实习经历&#xff0c;看你在南京中孚数据安全部做实习生&#xff0c;你能大概讲一下做什么的吗 当时做的是一个隐写溯源项目&#xff0c;是我们实验室跟南京中孚那边共同合作的。主要是针对电子文档信息泄露&#xff0c;…

牛市来临,模块化赛道可能会出现下个以太坊?

市场专家普遍预测&#xff0c;2024年将成为加密货币市场迎来新一轮牛市的关键时刻。研究人员将下一次比特币&#xff08;BTC&#xff09;减半以及2024年现货BTC ETF&#xff08;交易所交易基金&#xff09;的可能性视为推动下一次牛市的潜在因素。这一牛市的可能爆发有望吸引大…

C# Web应用调用EXE文件的一些实践

目录 需求 范例运行环境 可执行文件的设计 调用可执行文件方法 RunExecuteFile RunShellExecuteFile 方法的区别 WEB调用举例 小结 需求 最近同事使用Python开发了一款智能文字转语音的程序&#xff0c;经讨论部署在WINDOWS环境服务器下&#xff0c;因此需要生成目标…

C语言函数实现冒泡排序

前言 今天我们来看看怎么使用函数的方式实现冒泡排序吧&#xff0c;我们以一个数组为例arr[] {9,8,7,6,5,4,3,2,1,0},我们将这个数组通过冒泡排序的方式让他变为升序吧。 代码实现 #include<stdio.h> void bubble_sort(int arr[], int sz) {int i 0;for (i 0;i < s…

如何使用GraphQL和Apollo构建一个宝可梦应用

宝可梦是一个由视频游戏、动画系列与电影、交换卡牌游戏以及其他相关媒体组成的日本媒体特许经营权。 在本文中&#xff0c;我们将使用一个宝可梦GraphQL API&#xff0c;该API提供有关不同宝可梦的数据。 我们将使用Apollo和GraphQL来处理数据获取&#xff0c;以及React来构…

数据库之DCL操作(用户、访问权限。)

DCL英文全称是Data control language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 1.管理用户 1.1查询用户 select * from mysql.user; 其中 Host代表当前用户访问的主机&#xff0c;如果为localhost&#xff0c;仅代表只能够在当前本机访问&…

git上传到本地仓库

摘要&#xff1a;本地初始化init仓库&#xff0c;进行pull和push&#xff1b;好处是便于利用存储设备进行git备份 git init --bare test.git 随便到一个空的目录下git clone 然后使用git上传 把git仓库删除之后再clone一次验证一下是否上传成功&#xff1a; 如果在ubantu上面没…

嵌入式面向对象学习 RT-Thread I/O 设备管理框架 设备驱动层 案例测试

嵌入式面向对象 RT-Thread I/O 设备管理框架 设备驱动层 注&#xff1a;本文介绍性内容转载于《RT-Thread记录&#xff08;十、全面认识 RT-Thread I/O 设备模型&#xff09;》 注&#xff1a; 本次使用的开发板 &#xff1a; ​ 兆易创新GD32F407VET6开发板 ​ 雅特力科技…

c++的学习之路:7、类和对象(3)

目录 一、初始化列表 二、static成员 三、友元 四、内部类 五、匿名对象 六、类和对象的思维导图 一、初始化列表 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟一个放在括号中的初始…