leetcode 376. 摆动序列 思考分析

目录

    • 题目
    • 思路分析
    • 代码
    • 总结

题目

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

例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

在这里插入图片描述

思路分析

画出序列波动图:
在这里插入图片描述
可以发现,我们删除的是单调递增或者递减的坡上的结点(不包括坡顶和坡底)
局部最优:删除单调坡度上的结点,那么这个坡度就可以有两个局部峰值
全局最优:整个序列有最多的局部峰值,从而达到最长摆动序列。
实际操作中只需要统计数组中的峰值数量即可。
在实际操作中的时候我们需要用到cur_delta = nums[i] - nums[i-1],pre_delta = nums[i-1] - nums[i-2].
从数组的左端开始,默认序列右端是个峰值。
如果cur_delta >0 && pre_delta <=0 或者 cur_delta <0 && pre_delta >=0,我们认为存在一个峰值。
(因为 pre_delta 被初始化为 0 了,所以这里要加上=号)
并且,只有在存在峰值的时候,我们才更新pre_delta ,因为统计的是峰值,一定是以上一下的,prediff之前是上,接下来就是下

代码

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int n = nums.size();if(n<=1) return n;int peak_nums=1;int delta_pre_curr=0;int delta_ppre_pre=0;for(int i = 1;i < n;i++){delta_pre_curr=nums[i]-nums[i-1];if((delta_pre_curr > 0 && delta_ppre_pre <= 0) || (delta_pre_curr < 0 && delta_ppre_pre >= 0)){peak_nums++;delta_ppre_pre=delta_pre_curr;}}return peak_nums;}
};

总结

1.保持区间波动,只需要把单调区间上的元素移除就可以了。
2.因为题目并不需要我们确定最终的序列是什么,所以其实只是要找整个序列单调增/减了几次。
3.为什么可以将previous diff设置为0是因为他只会在一开始等于0,后面他会被current diff更新,并且如果current diff不满足严格正/负变符号他就不会更新previous diff,所以len(nums)==2不需要单独拿出来写几行代码
4. res从1开始记录,因为出发点肯定算一个

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

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

相关文章

[EF在VS2010中应用Entity framework与MySQL

在VS2010中应用Entity framework与MySQL 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议本文讲述了在VS2010中使用EF与MySQL的一个简单示例。 工具安装&#xff1a; 1&#xff0c;MySQL MySQL Community Server Connector/NET 6…

c++ cdi+示例_C ++“和”关键字示例

c cdi示例"and" is an inbuilt keyword that has been around since at least C98. It is an alternative to && (Logical AND) operator and it mostly uses with the conditions. “ and”是一个内置关键字&#xff0c;至少从C 98起就存在。 它是&&am…

Python上个手

Python&#xff0c;由吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;在1989打发圣诞节放假时间的一门“课余”编程项目&#xff0c;至今已有二十多年的历史&#xff0c;语法简洁清晰&#xff0c;深受喜爱&#xff1b; 小窥 # 查看版本 python -V # 输出 print "he…

十、美化界面

一、背景图片 二、透明化处理 BackColor—web—Transparent 三、数据库建表语句 数据库 USE [fiber_yy] GO /****** Object: Table [dbo].[yy_user_record] Script Date: 06/20/2022 18:54:48 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADD…

如何写出优美的代码(二)

&#xff08;本文思想基本来自于经典著作《重构》一书&#xff09; 上一篇 http://www.cnblogs.com/ceys/archive/2012/03/05/2379842.html#commentform 上一篇文章主要讲了怎么给函数整容。现在我们大家基本上都使用面向对象语言&#xff0c;什么样的“对象”才是优美的呢&…

转:链表相交问题 详解

源地址&#xff1a;http://blog.163.com/bbluesnow126/blog/static/27784545201251051156817/ 链表相交问题 2012-06-10 17:15:37| 分类&#xff1a; 算法 | 标签&#xff1a;微软面试题 |字号 订阅 1、如何判断一个单链表有环 2、如何判断一个环的入口点在哪里 3、如何知…

VS 如何修改C++编译标准

第一步&#xff0c;打开项目资源管理器的属性页面 第二步&#xff0c;选择配置属性->C/C>语言->C语言标准 第三步&#xff0c;选择合适的标准&#xff0c;一般来说选最新即可

维吉尼亚密码和一次性密码本_密码学中的一次性密码

维吉尼亚密码和一次性密码本The One-time Pad cipher is almost similar to the Vernam cipher, as, like the vernam cipher, this cipher technique also encrypts the plain text by working on the binary level of the text. The only difference between the two is that…

十一、纺织面料下架功能的实现

一、数据库 数据库仍用yy_textile表&#xff0c;前几篇博文都叙述过这里就不再叙述 在fiber_yy数据库下创建yy_textile表 初始数据库信息 二、页面 admin_undercarriage 三、代码实现 admin_undercarriage using System; using System.IO; using System.Data; using S…

svg和canvas的应用场景分析【转载】

原文地址&#xff1a;http://blogs.msdn.com/b/weizhong/archive/2011/07/16/canvas-svg.aspx 思考什么时候使用Canvas 和SVG wzhong 15 Jul 2011 9:07 PM 0HTML5 Canvas 和 SVG 是 IE9 中引入的两项令人激动的图形功能。上周在拉斯维加斯举办的 MIX11 大会对这两个功能进行了介…

【C++grammar】文件系统以及path类使用

目录1.文件系统概述1、关于路径2、如何将某个路径下的所有文件递归地找出来&#xff1f;2.路径类及操作1、path类的成员函数2、path类的非成员函数示例1&#xff1a;展示C17中的path对象的用法示例2&#xff1a;展示Path类中用于分解路径成分的函数示例3&#xff1a;展示path相…

scala hashmap_如何在Scala中将Hashmap转换为Map?

scala hashmapLets first understand what are maps and hashmaps? 首先让我们了解什么是map和hashmap &#xff1f; map in Scala is a collection that stores its elements as key-value pairs, like a dictionary. Scala中的map是一个集合&#xff0c;将其元素存储为键值…

十二、所有功能实现效果演示

一、系统项目架构 Ⅰ&#xff0c;fiber_yy数据库下有五张表 yy_admin&#xff1a;管理员登录账号和密码 yy_textile&#xff1a;纺织面料数据信息 yy_textile_record&#xff1a;用户购买纺织面料信息所存储的面料流水信息 yy_user&#xff1a;用户登录注册信息 yy_user_reco…

行业软件之PTV微观软件VISSIM4.3 5.0 5.1 5.2 5.3 5.4下载和相关资料

他是干什么的&#xff1a;http://baike.baidu.com/view/3656765.htm 中国代理销售的公司的网址&#xff1a;辟途威交通科技(上海)有限公司 官网&#xff1a;http://www.ptvchina.cn/ 看看视频中软件的运行效果&#xff1a;http://v.youku.com/v_show/id_XMzExMjg1MDEy.html 如何…

一、单个神经元网络构建

一、本人使用编译器为Jupyter Notebook&#xff0c;tensorflow版本为1.13.1 import tensorflow as tf print(tf.__version__) """ 1.13.1 """二、训练单个神经元网络 x为-1.0, 0.0, 1.0, 2.0, 3.0, 4.0 y为-3.0, -1.0, 1.0, 3.0, 5.0, 7.0 人用…

ruby 生成随机字符串_Ruby程序生成随机数

ruby 生成随机字符串产生随机数 (Generating random number) The task is to generate and print random number. 任务是生成并打印随机数。 Generating random numbers means that any number can be provided to you which is not dependent on any pre-specified condition…

leetcode 322. 零钱兑换 思考分析

目录1、题目2、思路分析3、参考链接1、题目 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1。 你可以认为每种硬币的数量是无限的。 提示&#xff1a; 1 …

linux上的英文字体monospace可以在windows用吗?

linux的字体都是开源的&#xff0c;应该可以官方下载本地下载转载于:https://www.cnblogs.com/52linux/archive/2012/03/14/2396103.html

Flash Builder 创建CSS

1.global 选择器将样式应用于所有控件 在 Flash Builder 中创建新MXML 文件并切换到设计模式 属性视图右侧的外观视图可更改外观 Flash Builder 自动创建CSS 文件 CSS 文件有2 个命名空间&#xff1a; s 指 Spark 组件 mx 指 MX 组件 1. Global 与Application 选择器 global …

ruby打印_Ruby程序打印数字的力量

ruby打印Ruby中数字的幂 (Power of a number in Ruby) The task to develop a program that prints power of a number in Ruby programming language. 开发可以用Ruby编程语言打印数字幂的程序的任务。 If we want to calculate the power of a number manually then we have…