8.2摆动序列(LC376-M)

算法:

其实动态规划和贪心算法都能做

但是动态规划的时间复杂度是O(n^2)

贪心算法的时间复杂度是O(n)

所以学习贪心算法

到底为什么用贪心?(分析局部最优和全局最优)

局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值

整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列

局部最优推出全局最优,并举不出反例,那么试试贪心!

实际操作上,其实连删除的操作都不用做,因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度)

遍历时,遇到摆动就++

这就是贪心所贪的地方,让峰值尽可能的保持峰值,然后删除单一坡度上的节点

对应的代码:

峰值,即前后差为一正一负,那就要计算前后差

前差: prediff = nums[i]-nums[i-1]

后差:curdiff = nums[i+1]-nums[i]

峰值:prediff<0 and curdiff > 0

实际写代码之前要考虑多种情况:

本题异常情况的本质,就是要考虑平坡, 平坡分两种,一个是 上下中间有平坡,一个是单调有平坡

而且,求坡度至少要3个数,那还要再考虑nums只有两个数的情况。

最后一共有三种情况:

  1. 情况一:上下坡中有平坡
  2. 情况二:数组首尾两端(统计峰值的时候,数组最左面和最右面如何统计呢?题目中说了,如果只有两个不同的元素,那摆动序列也是 2。)
  3. 情况三:单调坡中有平坡

结合具体情况画坡度图分析:

1.情况一:上下坡中有平坡

例如 [1,2,2,2,1]这样的数组:

峰值:prediff==0 and curdiff<0  或者 prediff>0 and curdiff==0 

情况二:数组首尾两端

判断prediff和curdiff的前提是数组至少有3个元素,那如果只有2个呢?

此时之前的规则就不好使了。

解决方法:

可以假设,数组最前面还有一个数字,那这个数字和首个数字相同,即prediff==0?(但实际代码中没有加数值这一步,只要result初始值=1就可以)

那么为了规则统一,针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即 preDiff = 0,如图:

result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2)。

情况三:单调坡度有平坡

这个序列其实没有摆动,只有头尾两个值,结果应该为2。如图:prediff=0 and curdiff >0

但是在前两种情况中:prediff=0 and curdiff >0,result++,结果就会变成3,就会报错。

问题在哪?

prediff一直跟着curdiff更新:循环中,prediff = curdiff

解决方法:

不要实时更新prediff。

只需要在 这个坡度 摆动变化的时候,更新 prediff 就行,这样 prediff 在 单调区间有平坡的时候 就不会发生变化

正确代码:

class Solution {public int wiggleMaxLength(int[] nums) {//初始化int result = 1;//处理只有2个数的情况int prediff = 0;int curdiff = 0;//处理只有0\1个数的情况if (nums.length<=1) {return nums.length;}//贪心算法,局部最优-全局最优//注意:i<nums.length,不能取等!索引不到!for (int i=1;i<nums.length;i++){curdiff = nums[i]-nums[i-1];//若出现峰值,result++if (prediff >=0 && curdiff <0 || prediff <=0 && curdiff >0){result++;prediff = curdiff;}}return result;}}

注意:

1.for循环:i<nums.length,不能取等!索引不到!

2.int result = 1;//这样就已经处理了情况2了

时间空间复杂度:

  • 时间复杂度:O(n)。其中n 是序列的长度。我们只需要遍历该序列一次。
  • 空间复杂度:O(1)。我们只需要常数空间来存放若干变量。

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

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

相关文章

第一篇【传奇开心果系列】beeware开发移动应用:轮盘抽奖移动应用

系列博文目录 beeware开发移动应用示例系列博文目录一、项目目标二、开发传奇开心果轮盘抽奖安卓应用编程思路三、传奇开心果轮盘抽奖安卓应用示例代码四、补充抽奖逻辑实现五、开发传奇开心果轮盘抽奖苹果手机应用编程思路六、开发传奇开心果轮盘抽奖苹果手机应用示例代码七、…

如何配置Pycharm服务器并结合内网穿透工具实现远程开发

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

NLP深入学习(五):HMM 详解及字母识别/天气预测用法

文章目录 0. 引言1. 什么是 HMM2. HMM 的例子2.1 字母序列识别2.2 天气预测 3. 参考 0. 引言 前情提要&#xff1a; 《NLP深入学习&#xff08;一&#xff09;&#xff1a;jieba 工具包介绍》 《NLP深入学习&#xff08;二&#xff09;&#xff1a;nltk 工具包介绍》 《NLP深入…

JS的数据类型和运算符

typeof()方法&#xff1a;检测数据类型 JS中的基本数据类型 基本数据类型 1.number 数字 2.string 字符串 3.boolean 布尔 4.null 代表空值&#xff08;typeof方法检测出来的数据类型是object类型&#xff09; 5.underfined 未定义&#xff1b;变量已声明但是未赋值 6.…

QT Model/View 设计模式中 selection 模型

1. QT 的 selection 模型是用来做什么的&#xff1f; Qt的selection模型用于管理TableView中的选择操作。它允许用户选择和操作特定的数据。 2. Selection 模型用途的例子&#xff1f; 当使用Qt的TableView时&#xff0c;可以使用selection模型来实现以下用途&#xff1a; …

vue路由-全局前置守卫

1. 介绍 详见&#xff1a;全局前置守卫网址 使用场景&#xff1a; 对于支付页&#xff0c;订单页等&#xff0c;必须是登录的用户才能访问的&#xff0c;游客不能进入该页面&#xff0c;需要做拦截处理&#xff0c;跳转到登录页面 全局前置守卫的原理&#xff1a; 全局前置…

KubeSphere 核心实战之二【在kubesphere平台上部署redis】(实操篇 2/4)

文章目录 1、登录kubesphere平台2、redis部署分析3、redis容器启动代码4、kubesphere平台部署redis4.1、创建redis配置集4.2、创建redis工作负载4.3、创建redis服务 5、测试连接redis 在kubesphere平台上部署redis应用都是基于redis镜像进行部署的&#xff0c;所以所有的部署操…

2022-ECCV-Adaptive Face Forgery Detection in Cross Domain

一、研究背景 1.伪造视频是逐帧生成的&#xff0c;因此会造成时间维度上的伪影。而鲁棒的检测模型需要对同一身份的不同帧有一致的检测结果。 1.利用频率线索进行deepfake检测效果良好&#xff0c;但也会导致帧间不一致问题&#xff0c;即不同帧检测结果不同。 2.以往方法中固定…

【JavaScript】面向后端快速学习 笔记

文章目录 JS是什么&#xff1f;一、JS导入二、数据类型 变量 运算符三、流程控制四、函数五、对象 与 JSON5.1 对象5.2 JSON5.3 常见对象1. 数组2. Boolean对象3. Date对象4. Math5. Number6. String 六、事件6.1 常用方法1. 鼠标事件2. 键盘事件3. 表单事件 6.2 事件的绑定**1…

【咕咕送书 | 第八期】羡慕同学进了大厂核心部门,看懂这本书你也能行!

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论…

VMware虚拟机设置NAT网络模式

查看本地服务器网卡ip10.9.158.77 设置vmNet8虚拟网卡ip10.9.58.177&#xff0c;不需要在同一网段 3.点击VMware设置“虚拟网络编辑器”&#xff0c;点击“NAT设置”所有设置的ip网段需要与第二步的VMNet8网卡的网一致

LeetCode 2788. 按分隔符拆分字符串

一、题目 1、题目描述 给你一个字符串数组 words 和一个字符 separator &#xff0c;请你按 separator 拆分 words 中的每个字符串。 返回一个由拆分后的新字符串组成的字符串数组&#xff0c;不包括空字符串 。 注意 separator 用于决定拆分发生的位置&#xff0c;但它不包含…

算法 动态分析 及Java例题讲解

动态规划 动态规划&#xff08;英语&#xff1a;Dynamic programming&#xff0c;简称 DP&#xff09;&#xff0c;是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的&#xff0c;通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适…

day-15 按分隔符拆分字符串

思路 依次对words的每个字符进行split(),然后将非空的加入List 解题方法 String arr[]s.split(ss);利用split()方法将words的每个字符串划分为String数组 if(arr[i]!“”) //将非空的加入 list.add(arr[i]); String ss“”separator; //使用转义字符 时间复杂度&#xff1a;…

HCIA——18实验:NAT

学习目标&#xff1a; NAT 学习内容&#xff1a; NAT 1.要求——基本的 2.模型 3.IP分配、规划、优化 1&#xff09;思路 R2为ISP路由器&#xff0c;其上只能配置ip地址&#xff0c;不得冉进行其他的任何配置—ospf配置 认证 、汇总、沉默接口、加快收敛、缺省路由 PC1-PC2…

配置免费的SSL

1 引言 本文介绍了如何在 Linux 环境下使用免费的 Let’s Encrypt 为你的网站配置 SSL 证书的方法&#xff0c;以及如何在 Nginx 服务器中启用 SSL。对于需要在自己的网站上启用 HTTPS 的用户来说非常实用。 2 SSL 简介 SSL&#xff0c;全称为 Secure Sockets Layer&#xf…

React一般可以用哪些值作为key?

在 React 中&#xff0c;key 是用来帮助 React 核对 Virtual DOM 中的节点是否发生变化的。key 值唯一且稳定有助于提高渲染性能&#xff0c;因为 React 可以根据 key 值判断哪些元素需要重新渲染。 一般来说&#xff0c;以下属性可以作为 key 值&#xff1a; 数据库中的 ID&a…

制动盘市场分析:预计2029年将达到123亿美元

制动系统是高速列车动车组九大关键技术之一&#xff0c;制动性能的好坏将直接影响列车的行车安全及运行品质。制动系统按照操纵控制方式&#xff0c;主要分为电制动和空气制动。通常情况下&#xff0c;电制动和空气制动联合作用&#xff0c;但是在紧急制动情况下&#xff0c;只…

软件测试的原则有哪些?全文干货!

前言 大家好&#xff0c;我是chowley&#xff0c;最近阅读了不少博客&#xff0c;感觉在软件测试原则方面的内容还是太冗余和笼统&#xff0c;今天我来精简一下&#xff0c;用少量的语言告诉你最干活的东西&#xff01; 软件测试的原则 全面性&#xff08;Exhaustiveness&…

如何让对方主动想要联系你(过年了,你懂的)

开始之前&#xff0c;先纠正几个和女生聊天的误区&#xff1a; 1、女生很矜持&#xff0c;羞涩&#xff0c;不可能主动联系男生或者表白。 2、我越主动&#xff0c;我就掌握了主导权。错&#xff0c;越主动的一方越被动&#xff0c;越被动的一方越主动。比如&#xff1a;你主…