力扣376-摆动序列(java详细题解)

news2024/11/15 19:52:21

题目链接:https://leetcode.cn/problems/wiggle-subsequence/

前情提要:

因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。

贪心方法:局部最优推出全局最优。

如果一个题你觉得可以用局部最优推出全局最优,并且没有反例来反驳的话就可以用贪心来试试。

题目思路:

大家首先看到本题,可能会有点懵,什么是摆动序列,其实就是某一个数组里面的所有数它与前一个数的差(prediff)和它后一个数与它的差(curdiff)符号不同,则认为这个数组为摆动序列。

所以我们要做的就是将数组改为这样的一个序列。但其实我们可以不用改数组本身,因为该题要求输出一个结果,我们只要判断该数符合上述规律,如果不符合直接跳过不计数,反之则计数。

在这里插入图片描述

那我们怎么利用贪心来做呢?

其实本题的局部最优就是单调坡(上坡或者下坡)上去除多余的节点只保留起始和结束的节点,使其产生峰值和谷值。

全局最优:使整个序列都只存在峰值和谷值。

但本题只思考这些核心思路还不够。

还有三个问题需要考虑。

1.如果上下坡中有平坡怎么处理。

2.首尾俩值如何处理。

3.单调坡中出现平坡怎么处理。

情况一:上下坡中有平坡

如果有平坡,我们可以有俩种处理方式,第一种是留下第一个相等的数值,其余的都删掉,第二种是留下最后一个数值,其余的都删掉。

在这里插入图片描述

如图我们采用第二种方式,将前面三个相等的数值删掉,留下最后一个相等的。那么这种怎么用代码表示?

首先我们只拿最后一个2来分析,他的prediff=0,而他的curdiff可以大于0也可以小与0。

然后结合核心思路,只要prediff>=0 && curdiff <0 || predisff <= 0 && curdiff > 0。

就解决第一个情况。

情况二:首尾俩值如何处理。

因为核心思路是有要有三个值,才能产生一个摆动序列。

可是如果只有俩值呢,怎么办?

有俩种处理方式,第一种直接写死,当该数组只有俩值时,写一个处理逻辑。

第二种方式则需要一点代码技巧,我们在第一个值前虚拟加上一个平坡。

在这里插入图片描述

如图,如果加上平坡,那么就符合情况一所说,prediff=0,curdiff>0 或者 curdiff<0。

那么第一个值就能够计数,最后一个值我们可以直接初始化计数器为1。

这样首尾俩值就都处理好了。

情况三:单调坡度有平坡

在这里插入图片描述

如图我们还会出现这样的情况,如果出现这样的情况,prediff的更新方式就显得尤为重要。

prediff实时更新就是当符合核心思路遍历下一个数值时,prediff就可以直接赋值为curdiff。

如果prediff实时更新的话,当遍历到平坡最后一个2时,因为符合情况1,那么就会造成误判,这个2也会加上。

但这只是单调坡上的平坡,这个2并不能算上。

那么我们怎么解决。

我们可以不用实时更新prediff,只有当出现坡度变化时,即一个数满足核心思路时,则更新prediff就能解决。

最终代码:

class Solution {
    public int wiggleMaxLength(int[] nums) {
        //处理尾数 将result赋值为1
        int result = 1;
        //首部虚拟加上一个平坡 我们只用将prediff赋值为0即可。
        int prediff = 0;
        int curdiff = 0;
        //遍历每一个数值
        for(int i = 0;i < nums.length - 1;i ++){
            //curdiff需要实时更新
            curdiff = nums[i + 1] - nums[i];
            //如果我们实时更新的话 就会导致平坡时候误判。
            //所以我们在这个进行判断 当出现坡度变化才更新prediff。
            if(prediff >= 0 && curdiff < 0 || prediff <= 0 && curdiff > 0){
                result ++;
                prediff = curdiff;
            }
        }
        return result;
    }
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

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

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

相关文章

最新时光邮局系统,给未来写封信系统PHP源码美化版

源码介绍 最新时光邮局系统&#xff0c;给未来写封信系统PHP源码美化版视频教程。 给未来写封信开源源码&#xff0c;本源码支持用户给未来某个人发送一封信。前端采用MDUI框架后端对于定时发信采用screenphp的方式,未来将会增加其稳定性&#xff0c;寄出的信是可以在数据库查…

绝区零苹果电脑能玩吗,如何在Mac上玩绝区零?绝区零MacBook 下载安装保姆级教程

《绝区零》是一款由米哈游开发的都市动作冒险游戏&#xff0c;游戏的故事背景设定在一个名为「新艾利都」的现代化大都市中&#xff0c;玩家将扮演一对「绳匠」兄妹展开冒险。很多玩家都在问苹果电脑笔记本Mac怎么玩绝区零&#xff0c;今天就给大家介绍一下《绝区零》是一款什么…

信息打点-CDN绕过篇漏洞回链接口探针全网扫描反向邮件

知识点&#xff1a; 0、CDN知识-工作原理及阻碍 1、CDN配置-域名&区域&类型 2、CDN绕过-靠谱十余种技战法 3、CDN绑定-HOSTS绑定指向访问 CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和…

小程序列表滚动加载下一页数据功能实现指南

在前端小程序开发中&#xff0c;列表页是用户交互的核心部分之一。为了提高用户体验和页面响应速度&#xff0c;实现列表的滚动加载&#xff08;也称为“无限滚动”或“懒加载”&#xff09;功能显得尤为重要。本篇文章将详细介绍如何在小程序中实现这一功能&#xff0c;并提供…

基于vue框架的畅饮水站业务管理系统0wf4k(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;员工,会员,矿泉水,订单信息,派送任务,派送进度,评价记录,空桶回收,员工考勤,员工工资 开题报告内容 基于Vue框架的畅饮水站业务管理系统开题报告 一、研究背景与意义 随着健康意识的不断提升&#xff0c;直饮水、纯净水等健康饮水方式…

关于Seata的AT模式以及XA模式的理解

AT 模式 &#xff08;最终一致性&#xff09;的特点是性能较高&#xff0c;因为它只在第一阶段获取锁&#xff0c;在第一阶段提交后释放锁。相比之下&#xff0c;XA 模式&#xff08;强一致性&#xff09;需要在整个事务过程中占用数据库锁&#xff0c;因此性能相对较低。但是&…

为什么在JDBC中使用PreparedStatement?

为什么在JDBC中使用PreparedStatement&#xff1f; &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在JDBC编程中&#xff0c;PreparedStatement 因其以下优势而备受推崇&#xff1a; 性能提升&#xff1a;预编译的SQL语句可快速执行&#…

【C++11及其特性】explicit关键字

explicit关键字目录 一.explicit的含义1.中文含义2.用法 二.显示构造和隐式构造1.源码2.显示构造---()3.隐式构造---4.加上关键字 三.explicit作用 一.explicit的含义 1.中文含义 2.用法 写在构造函数前,那么在创建对象时就只能显示构造了,默认情况下是显示构造和隐式构造都可…

ctfshow之web55~web57(无字母的rce)

目录 web55 思路一&#xff1a; 思路二&#xff1a; web56 web57 本系列主要针对无字母rce或无字母无数字rce 声明&#xff1a;本章内容是引荐几位师傅的博客&#xff0c;然后根据自己的理解编写而成。 web55 if(isset($_GET[c])){$c$_GET[c];if(!preg_match("/\…

.net dataexcel winform控件 更新 日志

增加 列宽度调整时动态显示列象素大小 更改列的宽度可以使用 column.Width属性进行修改

文章解读与仿真程序复现思路——电网技术@EI\CSCD\北大核心《基于双缓冲区生成对抗模仿学习的电力系统实时安全约束经济调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

线段树维护更多类型的信息

P3870 [TJOI2009] 开关 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) sum维护一段区域的和&#xff1b;revers记录翻转懒信息&#xff1b; lazy&#xff1a;灯泡翻转后个数就是之前不亮的个数&#xff0c;revers变为原来的反 #include <iostream> using namespace s…

代码随想录第十九天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和,222. 完全二叉树的节点个数

110. 平衡二叉树 第一想法&#xff1a;首先要明确平衡二叉树的定义&#xff1f;左右节点的高度差不超过1&#xff1f;不会概念感觉无法下手... 返回参数返回int,为了标记已经不是平衡二叉树&#xff0c;用-1作标记 int traversal(TreeNode* root){if(rootnullptr) return 0;…

Linux_kernel烧写Uboot02

一、温故知新 1、开发环境 Ubuntu的Linux操作系统(18.04 20.04 22.04) 前面的版本号是双数&#xff0c;后面的版本号是04 lsb_release -a 用于查看系统版本号 uname -a 查看系统位数/内核版本号 2、体系架构 APP 各种控制界面\通…

数据库 变更和版本控制管理工具 --Bytebase 安装部署

数据库 变更和版本控制管理工具 --Bytebase 安装部署 文章目录 数据库 变更和版本控制管理工具 --Bytebase 安装部署前言一.Docker部署Bytebase1.Docker 配置2. pull 数据3. 执行部署4. 打开浏览器 部署完成 二、使用步骤1.注册超管2.配置 Configure External URL 总结 前言 B…

点餐收银小程序

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《点餐收银小程序》。 系统含管理员/商家/用户三种角色&#xff0c;商家能维护菜式类别、维护菜品信息&#xff0c;用户在小程序能够选择门店&#xff0c;查看门店下各个分类的菜式信息&#xff0c;并进行加购…

【vSphere 7/8】深入浅出 vSphere 证书 Ⅲ—— vSphere 证书的更新和替换概述

目录 摘要1. vSphere Certificate Architecture2. 证书更新和替换概述2.1更新 VMCA 签名的证书&#xff08;1&#xff09;使用 vSphere Client UI&#xff08;2&#xff09;使用 vSphere Certificate Manager 命令行工具&#xff08;自动&#xff09;&#xff08;3&#xff09;…

行业大模型元年,“有云处皆智能”的愿景还有多远?

打造新质生产力、推动高质量发展&#xff0c;已成为众多行业用户在数字经济时代的一道必答题。 今年《政府工作报告》就提出要深化大数据、人工智能等研发应用&#xff0c;开展“人工智能”行动&#xff0c;大力推进现代化产业体系建设&#xff0c;加快发展新质生产力。这其中…

IBM是中国IT界的黄埔军校

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 我第一次听说IBM还是小的时候&#xff0c;当时很多人都说IBM是厉害&#xff0c;外号“蓝色巨人”&#xff0c;潜移默化我也知道IBM牛了。 而且当年我买的第一款笔记本电脑就是IBM的ThinkPad系列&#xff0c;花了6…

Python酷库之旅-第三方库Pandas(112)

目录 一、用法精讲 491、pandas.DataFrame.cumsum方法 491-1、语法 491-2、参数 491-3、功能 491-4、返回值 491-5、说明 491-6、用法 491-6-1、数据准备 491-6-2、代码示例 491-6-3、结果输出 492、pandas.DataFrame.describe方法 492-1、语法 492-2、参数 492…