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.mfbz.cn/a/335369.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GZ036 区块链技术应用赛项赛题第3套

2023年全国职业院校技能大赛 高职组 “区块链技术应用” 赛项赛卷&#xff08;3卷&#xff09; 任 务 书 参赛队编号&#xff1a; 背景描述 新能源作为新兴领域&#xff0c;产业呈现碎片化与复杂化的特性&#xff0c;逐渐出现管理困难、供应链金融、可信监管与数…

An Association-Based Fusion Method for Multi-Modal Classification

F ∈ { C o n c a t ; A d d } \in\{Concat;Add\} ∈{Concat;Add} 辅助信息 作者未提供代码

【算法分析与设计】H指数

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳中求进&#xff0c;晒太阳 题目 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维…

人工智能 | 自然语言处理的发展历程

github&#xff1a;https://github.com/MichaelBeechan CSDN&#xff1a;https://blog.csdn.net/u011344545 自然语言处理的发展 方向一&#xff1a;技术进步1. 基于规则的语法&#xff08;1950-1990&#xff09;2. 统计语言处理&#xff08;1990-2010&#xff09;3. 基于深度学…

【PICO】【Unity】【VR】如何对打包后的PICO项目有效Debug

【背景】 PICO项目打包后再运行就看不到Console了。当然,会有各类专业的Debug工具。 有一类Debug的工具是Preview形式下展示Debug信息,但是发现Preview成功不见得打包也成功。 打包后也会有一些Debug工具,不过这里我给出自己的简单解决办法。 【解决方案】 Unity Console…

KubeSphere 核心实战之一【在kubesphere平台上部署mysql】(实操篇 1/4)

文章目录 1、登录kubesphere平台2、kubesphere部署应用分析2.1、工作负载2.2、服务2.3、应用路由2.4、任务2.5、存储与配置2.6、部署应用三要素 3、部署mysql3.1、mysql容器启动实例3.2、mysql部署分析3.3、创建mysql的配置3.4、创建mysql的数据卷pvc3.5、创建mysql工作负载3.6…

视频监控需求记录

记录一下最近要做的需求&#xff0c;我个人任务还是稍微比较复杂的 需求&#xff1a;需要实现一个视频实时监控、视频回放、视频设备管理&#xff0c;以上都是与组织架构有关 大概的界面长这个样子 听着需求好像很简单&#xff0c;但是~我们需要在一个界面上显示两个厂商的视…

1.C语言——基础知识

C语言基础知识 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…

C#使用Graphics绘图通过加载纹理底图的方式绘制纹理效果

纹理图片 加载效果如下图&#xff1a; 在扇形上把纹理图片作为底&#xff0c;渲染到绘制的图像中。 图形渲染中&#xff0c;纹理可以包括各种图像&#xff0c;如照片、图标、图案等。这些图像被映射到三维模型的表面&#xff0c;使得表面看起来像是被这些图像所包裹。 主要特点…

基于SSM的图书馆管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的图书馆管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

AIGC - 视频生成模型的相关算法进展

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135688206 视频生成技术确实是一个很有潜力的颠覆性技术领域&#xff0c;可以作为企业创新梯队的重点关注方向&#xff0c;最近发展很快&#xff…

Docker--harbor

目录 一、搭建本地私有仓库 Docker容器的重启策略如下&#xff1a; 二、Harbor 简介 2.1Harbor是什么 2.2Harbor的特性 2.3Harbor的构成 2.4架构的数据流向 三、harbor部署以及配置文件 环境准备 部署Docker-Compose服务 下载或上传Docker-Compose&#xff1a; 赋予…

验证回文串[简单]

优质博文&#xff1a;IT-BLO-CN 一、题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个回文串。 字母和数字都属于字母数字字符。 给你一个字符串s&#xff0c;如果它是回文串&#xff…

MySQL---视图索引

表定义&#xff1a; 学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;S…

【JavaEE】文件操作 —— IO

文件操作 —— IO 1. 文件的属性 文件内容文件大小文件路径文件名称 2. 文件的管理 采用树形结构进行管理。 3. 文件路径 分为两种&#xff1a;相对、绝对路径。 相对路径&#xff1a;相对于当前位置的路径&#xff0c;以“./xxx.xxx”为标志绝对路径&#xff1a;以从盘符…

MySQL作业

目录 1.实验需求1&#xff1a; &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; &#xff08;4&#xff09; &#xff08;5&#xff09; 2.实验步骤1&#xff1a; &#xff08;1&#xff09;完成上述实验需求1&#xff0c;需要先创建一…

DAY13--learning English

一、积累 1.jog Riding rollercoaster is even like a daily jog for this man, 对这个男人来说坐过山车甚至就像每天散步一样轻松. 2.admission Admission to guilt. 承认有罪 3.summon I love the guy hes literally summon Karpov into material plane. 我喜欢这家伙他真…

牛牛的猜球游戏

置换群 前缀和 思想 学好线性代数 做这题很有意思&#xff0c;记得多校也有一道置换群的好题&#xff5e; 把多次变换看成一个置换矩阵就好也就是 I (一开始为单位矩阵) ->经过A作用产生了B->经过C作用产生了D 即 CAI D 现在让我们求一下 CI &#xff1f; 两边右…

C++浮点数比较

根据资料&#xff0c;C浮点数计算时存在精度误差&#xff0c;在一些情况下比较浮点数可能应使用特定的比较函数&#xff1b; #include "stdafx.h" #include<iostream>using namespace std;#define EPS 1e-9int main(int argc, char* argv[]) {double a 0.3;do…

利用appium自动控制移动设备并提取数据

安装appium-python-client模块并启动已安装好的环境 安装appium-python-client模块 在window的虚拟环境下执行pip install appium-python-client 启动夜神模拟器&#xff0c;进入夜神模拟器所在的安装路径的bin目录下&#xff0c;进入cmd终端&#xff0c;使用adb命令建立adb…