【算法与数据结构】376、LeetCode摆动序列

文章目录

  • 一、题目
  • 二、解法
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述

二、解法

  思路分析:本题难点在于要考虑到不同序列的情况,具体来说要考虑一下几种特殊情况:

  • 1、上下坡中有平坡:[1 2 2 2 1];
  • 2、数组首尾两端:[1 2] [1 1 2];
  • 3、单调坡中有平坡: [1 2 2 2 3 4 5];
      观察一下不难发现,序列的最大摆动子序列的长度和局部峰值有关系。因此我们首先要找的就是局部峰值。定义preDiff和curDiff分别记录上一个差值和当前差值。对于小于等于1的序列直接输出其长度。贪心算法要做的就是删除单调区间内的元素。事实上也不需要去修改原序列,只需删除单一坡度上的节点,然后统计长度考虑局部峰值即可。情况一种仅有最大摆动子序列长度为3,我们统一删除前两个2 变成[1 2 1]长度为3。
    在这里插入图片描述
      对于情况2,我们假设默认最右边有一个峰值result=1,同时preDiff初始化为0,也就是说,[1 2]的序列可以看成[1 1 2]。这两个序列的最大摆动子序列长度相同,为2。
      对于情况3,我们选择在摆动变化的时候更新preDiff,而非每次curDiff变换就修改preDiff,因此在每个单调区间内preDiff只会发生一次变化。
    在这里插入图片描述
      程序如下
class Solution {
public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() <= 1) return nums.size();	// 序列元素小于等于1的情况int curDiff = 0;	// 记录当前差值int preDiff = 0;	// 记录上一个差值int result = 1;		// 记录峰值个数,默认序列最右边有一个峰值,序列的最大摆动子序列的长度和局部峰值有关for (int i = 0; i < nums.size() - 1; i++) {curDiff = nums[i + 1] - nums[i];if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) {	// 出现局部峰值result++;preDiff = curDiff;	// 只在摆动变化的时候更新preDiff}	}return result;}
};

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

三、完整代码

# include <iostream>
# include <vector>
# include <algorithm>
using namespace std;class Solution {
public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() <= 1) return nums.size();	// 序列元素小于等于1的情况int curDiff = 0;	// 记录当前差值int preDiff = 0;	// 记录上一个差值int result = 1;		// 记录峰值个数,默认序列最右边有一个峰值,序列的最大摆动子序列的长度和局部峰值有关for (int i = 0; i < nums.size() - 1; i++) {curDiff = nums[i + 1] - nums[i];if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) {	// 出现局部峰值result++;preDiff = curDiff;	// 只在摆动变化的时候更新preDiff}	}return result;}
};int main() {vector<int> nums = { 1, 17, 10, 13, 10, 16, 8 };Solution s1;int result = s1.wiggleMaxLength(nums);cout << result << endl;system("pause");return 0;
}

end

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

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

相关文章

DSP的ADC简单笔记

DSP不需要复用GPIO&#xff0c;是单独的ADC引脚&#xff0c;与GPIO不共用 ADC时钟在PCLKCR0寄存器 所以还要配置HSPCLK HISPCP/HSPCLK寄存器 所以ADC的输入时钟&#xff0c;有固定公式&#xff1b; 控制寄存器1 简单配置3个东西&#xff1b; 控制寄存器2 设置为1软件触发 控…

构建强大应用的引擎:深度解析Spring Boot Starter机制

目录 引言1. Spring Boot Starter机制1.1 什么是Spring Boot Starter1.2 为什么要使用Spring Boot Starter1.3.应用场景1.4.自动加载核心注解说明 2. 综合案例配置类制作控制功能实现 总结 引言 在当今互联网时代&#xff0c;构建高性能、可维护的应用已成为开发者的首要任务。…

【智能家居】九、停车场车牌识别功能点(回调、解耦)

一、翔云 人工智能开放平台&#xff08;车牌识别&#xff09; 二、cJSON 库 三、实现代码 四、回调函数 五、人脸识别和车牌识别获取数据的区别 六、异步网络请求和同步网络请求的区别 七、解耦 一、翔云 人工智能开放平台&#xff08;车牌识别&#xff09; 翔云 人工智能开放…

MySQL数据库的基础概念

目录 顾名思义&#xff0c;数据库是用于存储数据的&#xff0c;那这些数据被存储在哪呢&#xff1f; 文件也能存储数据&#xff0c;那在这个基础上&#xff0c;为什么还要搞出一个数据库来存储数据呢&#xff1f; MySQL的客户端登录/退出指令、服务端的启动/关闭指令 数据…

【k8s】使用Finalizers控制k8s资源删除

文章目录 词汇表基本删除操作Finalizers是什么&#xff1f;Owner References又是什么&#xff1f;强制删除命名空间参考 你有没有在使用k8s过程中遇到过这种情况: 通过kubectl delete指令删除一些资源时&#xff0c;一直处于Terminating状态。 这是为什么呢&#xff1f; 本文将…

鸿蒙小车之多任务调度实验

说到鸿蒙我们都会想到华为mate60&#xff1a;遥遥领先&#xff01;我们一直领先&#xff01; 我们这个小车也是采用的是鸿蒙操作系统&#xff0c;学习鸿蒙小车&#xff0c;让你遥遥领先于你的同学。 文章目录 前言一、什么是任务&#xff1f;为什么要有任务二、任务的状态三、任…

idea2023解决右键没有Servlet的问题

复制Servlet Class.java中的文件。 回到文件&#xff0c;然后点击小加号 然后输入刚刚复制的东西&#xff1a; 3. 此时右键有servlet。 4. 然后他让你输入下面两个框&#xff1a; JAVAEE TYPE中输入Servlet Class Name 表示你要创建的Servlet类的名称是什么。自己起名字。然后…

vue中iframe标签跨域通信——父子页面之间传值(解决子页面收不到父页面的值或子页面收到的数据为undefined的问题)

背景 因为本系统需要支持第三方系统页面的嵌入&#xff0c;于是尝试使用iframe标签&#xff0c;进行跨域通信&#xff0c;父子页面相互传值。初始化时&#xff0c;父页面发送数据给子页面&#xff0c;需要在子页面加载完成后发送&#xff0c;不然接收不到数据。父页面直接给子页…

虚幻学习笔记13—C++静态和动态加载

一、前言 我们在蓝图中可以很方便的添加各种需要的组件&#xff0c;那么在C代码中要如何实现呢。在代码中分静态和动态加载&#xff0c;而无论静态和动态&#xff0c;加载的内容有资源和资源类&#xff0c;资源类通常为带资源的蓝图类。 二、实现 在实现静态或动态加载时&…

正则化实战( Lasso 套索回归,Ridge 岭回归)

Lasso 套索回归 导入包 import numpy as np from sklearn.linear_model import Lasso from sklearn.linear_model import SGDRegressor, LinearRegression原方程的计算结果 # 1. 创建数据集X&#xff0c;y X 2 * np.random.rand(100, 20) w np.random.rand(20, 1) b np.r…

服务器一直掉线怎么回事?

随着网络的高速发展&#xff0c;不管是网站还是游戏&#xff0c;如果遇到服务器卡顿的情况&#xff0c;会造成用户访问网站或进游戏&#xff0c;网站页面长时间无法打开&#xff0c;游戏页面运行卡顿&#xff0c;这样就很容易会造成用户的流失&#xff0c;从而导致业务亏损极大…

C++:命名空间

从今天正式开始对C的学习&#xff0c;这里只学习C对C的拓展&#xff0c;和C相同的部分在C语言专栏中都可以找到&#xff0c;我们先看一段C代码 #include<iostream> using namespace std; int main() {cout<<"hello world<<endl;return 0; } 同样也是打…