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

news2024/11/18 0:28:05

文章目录

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

所有的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.coloradmin.cn/o/1322839.html

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

相关文章

python学习,2.简单的数据类型

1.了解数及运算 整数&#xff1a;1&#xff0c;2&#xff0c;3。 运算符&#xff1a;加减乘除&#xff0c;**(乘方) 浮点数&#xff1a;python将所有带小数点的数称为浮点数。 这一块和别的语言有些不一样&#xff0c; 像C&#xff0c;分为float&#xff0c;double&#x…

河南开放大学形成性考核 平时作业 统一参考资料

试卷代号&#xff1a;1288 现代管理原理 参考试题&#xff08;开卷&#xff09; 一、单项选择&#xff08;下列选项中只有一个答案是准确的&#xff0c;请将其序号填入括号中。每小题2分&#xff0c;共20分&#xff09; 1.“凡事预则立&#xff0c;不预则废”&#xff0c;说…

极简Windows本机下载安装启动zookeeper

1.下载zookeeper Apache Download Mirrors 注意&#xff01;&#xff01;&#xff01;&#xff1a;安装的路径不要用中文 2.生成zoo.cfg文件 复制zookeeper的conf目录下的zoo_simple.cfg文件&#xff0c;并重命名为zoo.cfg 修改zoo.cfg文件中的路径(data&#xff0c;log…

Navicat 16最新操作

Navicat 16最新操作 1 知识小课堂1.1 Navicat 161.2 其他数据库连接工具 2 下载和安装2.1 下载2.2 安装 1 知识小课堂 1.1 Navicat 16 Navicat 16是一款功能强大的数据库管理工具&#xff0c;可以创建多个连接&#xff0c;方便管理不同类型的数据库&#xff0c;包括MySQL、Ora…

如何利用研发效能度量工具分析代码评审的效率、质量与瓶颈?

代码评审&#xff08;Code Review&#xff09;是保障代码质量中一个非常重要的环节&#xff0c;也是保证项目交付质量的关键一环。代码评审的开展对于产品质量提升、工程素养提升、研发团队的技术分享交流&#xff0c;或是完善团队代码规范&#xff0c;都能起到重要的促进作用。…

​【EI会议征稿通知】第三届智能系统、通信与计算机网络国际学术会议(ISCCN 2024)

第三届智能系统、通信与计算机网络国际学术会议&#xff08;ISCCN 2024&#xff09; 2024 3rd International Conference on Intelligent Systems, Communications and Computer Networks 第三届智能系统、通信与计算机网络国际学术会议&#xff08;ISCCN 2024&#xff09;将…

期货股市联动(期股联动助推资本市场上扬)

期股联动——期货股市助推资本市场上扬 随着我国资本市场的不断发展&#xff0c;期货和股票这两个市场也在逐渐紧密地联系起来。期货和股票的相互作用是一种“期股联动”&#xff0c;它能够促进资本市场的上扬。 期货与股票市场 期货市场是一种标准化的场外交易市场&#xf…

OpenAI发布AGI安全风险框架!董事会可随时叫停GPT-5等模型发布,奥特曼也得乖乖听话

OpenAI 再次强调模型安全性&#xff01;AGI 安全团队 Preparedness 发布模型安全评估与监控框架&#xff01; 这两天关注 AI 圈新闻的小伙伴们可能也有发现&#xff0c;近期的 OpenAI 可谓进行了一系列动作反复强调模型的“安全性”。 前有 OpenAI 安全系统&#xff08;Safety…

HarmonyOS(十五)——状态管理之@Prop装饰器(父子单向同步)

上一篇文章我们认识了状态管理的State装饰器&#xff08;组件内状态&#xff09;&#xff0c;接下来我们学习另外一个状态管理装饰器Prop装饰器。 Prop装饰的变量可以和父组件建立单向的同步关系。Prop装饰的变量是可变的&#xff0c;但是变化不会同步回其父组件。 说明&#…

可视化数据监控大屏网页界面,数据大屏模版PS资料(免费UI源文件)

数据大屏模板在大数据领域被广泛应用&#xff0c;其优势在于能够将复杂的数据通过图形、图表等方式呈现出来&#xff0c;使数据更易于理解。数据大屏模板可以用来进行数据分析。通过对数据的比较、趋势分析、异常检测等&#xff0c;可以发现数据中的规律和问题&#xff0c;为决…

SQL进阶理论篇(十):数据库中的锁

文章目录 简介按照锁的粒度进行划分从数据库管理的角度进行划分从程序员的角度进行划分为什么共享锁会发生死锁&#xff1f;参考文献 简介 索引和锁&#xff0c;是数据库中的两个核心知识点。 索引的相关知识点&#xff0c;在之前的几章里我们已经介绍的差不多了。接下来我们…

CEC2013(python):五种算法(HHO、WOA、GWO、DBO、PSO)求解CEC2013(python代码)

一、五种算法简介 1、哈里斯鹰优化算法HHO 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、蜣螂优化算法DBO 5、粒子群优化算法PSO 二、5种算法求解CEC2013 &#xff08;1&#xff09;CEC2013简介 参考文献&#xff1a; [1] Liang J J , Qu B Y , Suganthan P N , et al. P…

安卓开发学习---kotlin版---笔记(三)

网络 安卓主页的网络框架&#xff1a;OkHttp 在OkHttp的基础上进行封装的&#xff1a;Retrofit框架&#xff0c;更常使用 OkHttp学习 在使用网络请求的时候&#xff0c;先添加网络访问权限&#xff1a; <uses-permission android:name"android.permission.INTERNET&…

【数据结构】栈的使用|模拟实现|应用|栈与虚拟机栈和栈帧的区别

目录 一、栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环 3. 括号匹配 4. 逆波兰表达式求值 5. 出栈入栈次序匹配 6. 最小栈 1.5 概念区分 一、栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&…

数据库——水果商店进阶

智能2112杨阳 一、目的与要求&#xff1a; 综合运用SQL语言相关知识如变量、游标、函数、触发器等解决实际问题。 二、内容&#xff1a; 设计并完成以下实验&#xff0c;要求附上源码&#xff08;非截图&#xff09;&#xff0c;测试效果截图 在订单详情表orderitems插入新…

【openGauss/MogDB列存表的delta表测试】

列存储格式是OLAP类数据库系统最常用的数据格式&#xff0c;适合复杂查询、范围统计类查询的在线分析型处理系统。cstore列存储的主体数据文件以CU为I/O单元&#xff0c;只支持追加写操作&#xff0c;因此cstore只有读共享缓冲区。CU间和CU内的可见性由对应的CUDESE表&#xff…

高项-【整合管理】

8.1管理基础 项目整合管理由项目经理负责&#xff0c;责任不能被授权和转移。对整个项目承担最终责任。执行项目整合是担任双重角色&#xff1a; 组织层面&#xff0c;与项目发起人携手合作&#xff0c;了解战略目标&#xff0c;确保项目目标和成果与项目组合、项目集一集业务…

自助借还办证一体机软件需求说明书

1. 简介 1.1 项目概括 本项目主要实现读者自助办证、借书、还书、查询、续借的功能&#xff0c;减轻管理员的工作量&#xff0c;提升读者的借阅体验&#xff0c;提高了图书的借阅量与流通率&#xff0c;是图书馆智能化、无人化建设的重要步骤。 1.2 项目背景 ​ 目前各大图…

【ArkTS】如何修改应用的首页

之前看到一种说法&#xff0c;说是应用首页是 entry > src > main > resources > base > profile > main_pages.json 中src配置中数组第一个路径元素。这种说法是不对的&#xff01;&#xff01;&#xff01; 如果需要修改应用加载时的首页&#xff0c;需要…