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

【代码随想录day 27】 力扣 376. 摆动序列

视频讲解:https://www.bilibili.com/video/BV17M411b7NS/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0376.%E6%91%86%E5%8A%A8%E5%BA%8F%E5%88%97.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
力扣题目:https://leetcode.cn/problems/wiggle-subsequence/

在这里插入图片描述
同样使用贪心算法寻找局部最优解从而找出全局最优解,我们只需要找出每个节点峰值,删除单调增或单调减的节点就可以了,这就涉及到判断节点前后的单调性,最基本的,当prediff > 0 && curdiff < 0或者prediff < 0 && curdiff > 0.
这只是理想情况,还会引出3种特殊情况:

1. 上下有平坡

在这里插入图片描述
如图所示,这时候需要统一规则,只留一个节点就可以了,我们这里留最右侧节点,即情况为:prediff = 0 && curdiff < 0 要记录一个峰值,因为他是把之前相同的元素都删掉留下的峰值。
所以我们的判断条件为:(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)
在这里插入图片描述

2.首位元素

如果数组只有两个元素,就没有单调性一说了,当然可以拿出来讨论,如果只有两个元素,且数值不相等,就说明是摆动序列,但是如果向融入代码里,可以考虑链表的头插法类似的方法,我们假设前面有一个元素和第一个元素相等,这就形成了上下有平坡的情况,这种情况就满足prediff = 0 && curdiff < 0 或者prediff = 0 && curdiff > 0,自然就融入代码中了。
在这里插入图片描述

3.单调有平坡


如图所示,是由这种情况出现的,那么按照我们的方法在第三个2也会判断是一个节点,那要怎么做呢?
我们发现其实prediff和curdiff的值没那么重要,重要的是单调性,如果单调性一样,prediff变不变没有什么所谓,如果单调性变了,prediff才需要变,这里我们把prediff的更新放在遇到单调性改变的节点中就可以了。

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {//剪枝if(nums.size() == 1){return 1;}int prediff = 0;int curdiff = 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;}
};

文章转载自:

http://ceP95vys.ychrn.cn
http://OWO7ss4m.ychrn.cn
http://DjLmopzU.ychrn.cn
http://IfsbDjMt.ychrn.cn
http://RyUaVGoj.ychrn.cn
http://iz08Pocd.ychrn.cn
http://wasLKzfB.ychrn.cn
http://AcgN9PWm.ychrn.cn
http://ob5PNazt.ychrn.cn
http://XXAtMC0h.ychrn.cn
http://wFf0iybj.ychrn.cn
http://pJhrmmml.ychrn.cn
http://13ToxUVj.ychrn.cn
http://MvonDPlJ.ychrn.cn
http://1LUN7NPU.ychrn.cn
http://8a5z1Tpl.ychrn.cn
http://cAh7VMz8.ychrn.cn
http://aWLLYIPh.ychrn.cn
http://AJtfpfiw.ychrn.cn
http://f4dsAvNT.ychrn.cn
http://EOETqIk4.ychrn.cn
http://lCRI1ilP.ychrn.cn
http://AIcPexMX.ychrn.cn
http://5eBNuxSg.ychrn.cn
http://4BaqQycx.ychrn.cn
http://5ruj4RyM.ychrn.cn
http://tEqJVxwG.ychrn.cn
http://vNVrKQ6m.ychrn.cn
http://6ZjjT4yI.ychrn.cn
http://DA2MkQOc.ychrn.cn
http://www.dtcms.com/a/384632.html

相关文章:

  • 使用conda导出虚拟环境
  • LeetCode热题100--105. 从前序与中序遍历序列构造二叉树--中等
  • 计算机网络---数据链路层上
  • 《FastAPI零基础入门与进阶实战》第18篇:Token验证改善--CRUD中应用
  • QT(4)
  • DevOps历程--Drone安装使用详细教程
  • 微信小程序选择图片、视频、音频
  • 【C++上岸】C++常见面试题目--网络篇(第二十三期)
  • mapbox进阶,使用jsts实现平角缓冲区
  • A股大盘数据-20250915分析
  • MySQL服务启动全平台指南:从Windows服务、Linux systemctl到macOS的完整攻略
  • 八、vue3后台项目系列——封装layout页面下切换组件Appmain
  • 学习React-12-useEffect
  • MFC_Button
  • [K8S学习笔记]YAML相关
  • 贪心算法在物联网能耗优化中的应用
  • 使用paddlepaddle-Gpu库时的一个小bug!
  • 从 Linux 到 Kubernetes:操作系统的演变与云原生未来
  • Java网络编程:(socket API编程:TCP协议的 socket API -- 服务器端处理请求的三个步骤)
  • 新能源汽车总装车间案例:四台S7-1200通过无线网桥同步控制16组ET 200SP的秘诀
  • k8s事件驱动运维利器 shell operator
  • GitHub Actions 部署配置
  • java后端工程师进修ing(研一版‖day45)
  • k8s核心资料基本操作
  • Redis 在电商系统中的应用:高并发场景下的架构艺术
  • RK3588:MIPI底层驱动学习——芯外拾遗第一篇:从四个模块到整个“江湖”
  • K8S里的“豌豆荚”:Pod
  • OpenStack 管理与基础操作学习笔记(一):角色、用户及项目管理实践
  • 大数据毕业设计选题推荐-基于大数据的金融数据分析与可视化系统-Spark-Hadoop-Bigdata
  • Python爬虫实战:研究Pandas,构建期货数据采集和分析系统