C++算法练习day69——376.摆动序列

题目来源:. - 力扣(LeetCode)

题目思路分析

题目:摆动序列(Wiggle Subsequence)

给定一个整数序列 nums,找到具有最大长度的摆动序列。摆动序列的定义是:如果序列中的数字不是全部递增也不是全部递减,那么该序列就是摆动序列。一个空的或只包含一个元素的序列也被视为摆动序列。

思路

  1. 边界情况处理
    • 如果序列长度为1,直接返回1,因为单个元素本身就是一个摆动序列。
    • 如果序列长度为2,检查两个元素是否相等,如果相等返回1(因为两个相同的元素不构成摆动序列),否则返回2(两个不同元素自然构成一个摆动序列)。
  2. 跳过连续相同元素
    • 使用一个指针 k 来跳过序列开头所有连续相同的元素。这一步是为了避免在序列开始部分浪费计算资源,并且可以确定序列是否完全由相同元素组成。
  3. 核心逻辑
    • 遍历剩余序列,检查每个元素是否构成摆动(即当前元素与前一个元素和后一个元素的关系)。
    • 如果当前元素与前后元素构成摆动,则摆动序列长度加1。
    • 如果当前元素与前一个元素相等或者与前一个元素和后一个元素的关系不满足摆动条件,则尝试跳过后续不满足条件的元素,直到找到一个新的摆动点。
  4. 返回结果
    • 遍历结束后,返回计算得到的摆动序列的最大长度。

代码:

class Solution {  
public:  int wiggleMaxLength(vector<int>& nums) {  if (nums.size() == 1) {  return 1; // 单个元素是摆动序列  }  if (nums.size() == 2) {  if (nums[0] == nums[1]) {  return 1; // 两个相同元素不构成摆动序列  }  return 2; // 两个不同元素构成摆动序列  }  int k = 0;  // 跳过开头所有连续相同的元素  while (k < nums.size() - 1 && nums[k] == nums[k + 1]) {  k++;  }  if (k == nums.size() - 1) {  return 1; // 序列完全由相同元素组成  }  int ans = 2; // 初始化摆动序列长度为2(因为至少有两个不同的元素)  for (int i = k + 1; i < nums.size() - 1; i++) {  // 检查当前元素是否构成摆动  if ((nums[i] - nums[i - 1]) * (nums[i + 1] - nums[i]) < 0) {  ans++; // 构成摆动,长度加1  continue;  }  // 尝试跳过不满足条件的元素  int k_temp = i - 1;  while (i < nums.size() - 1 && (nums[i] - nums[k_temp]) * (nums[i + 1] - nums[i]) >= 0) {  i++;  }  if (i < nums.size() - 1) {  ans++; // 找到新的摆动点,长度加1  }  }  return ans;  }  
};

知识点摘要

  1. 边界情况处理:在处理数组、链表等数据结构时,考虑边界情况(如空数组、单个元素数组)非常重要。
  2. 滑动窗口/指针技术:通过指针或索引来遍历数组,跳过不必要的计算,提高算法效率。
  3. 数学判断:利用乘法判断数字间的大小关系,从而确定是否构成摆动。

摆动序列问题是一个经典的算法问题,它考察了对数组遍历、边界情况处理以及数学判断的综合应用能力。通过本题,我们可以学习到如何在遍历数组时高效地跳过不必要的元素,以及如何运用数学方法(如乘法判断)来简化问题。此外,本题也强调了边界情况处理的重要性,无论是单个元素数组还是两个元素的数组,都需要特殊处理。通过不断优化代码,我们可以提高算法的效率,从而更好地解决实际问题。

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

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

相关文章

Flume——sink连接Hive的参数配置(属性参数)

目录 配置文件官网属性参数例子 配置文件官网 可以参考官网的说明 属性参数 属性名默认值说明type无&#xff08;必须指定&#xff09;组件类型名称&#xff0c;必须是"hive"hive.metastore无&#xff08;必须指定&#xff09;元数据仓库地址&#xff0c;例如&…

Java面试题精选:设计模式(二)

1、装饰器模式与代理模式的区别 1&#xff09;代理模式(Proxy Design Pattern ) 原始定义是&#xff1a;让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问&#xff0c;并允许将请求提交给对象前后进行一些处理。 代理模式的适用场景 功能增强 当需要对一个对…

Java版-图论-最小生成树-Prim算法

实现描述 如图&#xff1a; Prim算法的基本思想是从一个顶点开始&#xff0c;逐步构建最小生成树。具体步骤如下&#xff1a; 随机选取一个顶点作为起始点&#xff0c;并将其加入最小生成树的集合中。从该顶点出发&#xff0c;选择一条边连接到其他未被访问的顶点中的最小权…

Linux WEB服务器的部署及优化

1.用户常用关于web的信息 1.1.什么是www www是world wide web的缩写&#xff0c;及万维网&#xff0c;也就是全球信息广播的意思。 通常说的上网就是使用www来查询用户所需要的信息。 www可以结合文字、图形、影像以及声音等多媒体&#xff0c;超链接的方式将信息以Internet…

Rust迭代器——drain

概述&#xff1a; 通常用于集合类型&#xff08;如Vec、HashMap等&#xff09;来移除并返回集合中的元素。就是会在遍历过程中将这些元素从集合中移除&#xff0c;使用drain可以避免在移除元素时进行多次分配内存和拷贝的操作&#xff0c;从而提高性能。 示例&#xff1a; le…

vba学习系列(9)--按需求计数单元格数量

系列文章目录 文章目录 系列文章目录前言一、按需求计数单元格数量1.需求 二、使用步骤1.vba源码2.整理后 总结 前言 一、按需求计数单元格数量 1.需求 一个表中有多个类型的单元格内容&#xff0c;比如&#xff1a;文字、数字、特殊字符、字母数字…… 我们要计数字母数字的…

【JAVAFX】普通的确认对话框使用

普通alert确认对话框 Alert alert new Alert(Alert.AlertType.CONFIRMATION, "确定要关闭窗口吗&#xff1f;", ButtonType.YES, ButtonType.NO);alert.setHeaderText(null);alert.initOwner(primaryStage);Optional<ButtonType> result alert.showAndWait()…

opencv获取摄像头的最大分辨率图像

事情是这样的&#xff0c;在拼多多花了40买了一个4k高清的摄像偷&#xff0c;确实清楚。但是我一直以为网络摄像头分辨率只有640*480,于是用python测试了一下&#xff0c;上代码 import cv2def get_max_resolution(camera_index):"""获取摄像头的最大分辨率。&…

Redis 数据结构(二)—集合和有序集合

集合&#xff08;Set&#xff09;允许用户将多个各不相同的元素&#xff08;文本或二进制数据&#xff09;存储到集合中&#xff0c;以无序的方式存储元素。 有序集合&#xff08;Sorted Set&#xff09;同时具有“有序”和“集合”两种性质。每个元素由一个成员和分值组成。成…

【HarmonyOS学习日志(13)】计算机网络之TCP/IP协议族(二)

文章目录 TCP/IP协议族ARPDNS标志字段&#xff1a;协商具体的通信方式和反馈通信状态DNS查询问题的格式资源记录&#xff08;Resource Record, RR&#xff09;格式&#xff1a;被用于应答字段、授权字段和额外信息字段 IP协议IP服务的特点无状态无连接不可靠 IP头部结构IPv4头部…

Python + Playwright:集成 Applitools 进行视觉回归测试(快速入门)

集成 Applitools 进行视觉回归测试(快速入门) 简介Applitools 的核心特点Applitools 的应用场景1. 准备工作2. 获取示例项目2.1 下载示例代码2.2 安装依赖2.3 选择测试运行方式3. 代码解析3.1 测试用例示例4. 运行测试4.1 设置 Applitools API 变量4.2 设置 Applitools Eyes …

javaScript交互补充

1、元素的三大系列 1.1、offset系列 1.1.1、offset初相识 使用offset系列相关属性可以动态的得到该元素的位置&#xff08;偏移&#xff09;、大小等 ●获得元素距离带有定位祖先元素的位置 ●获得元素自身的大小&#xff08;宽度高度&#xff09; ●注意&#xff1a;返回的…

【Linux】-学习笔记09

第六章、nfs网络文件系统 1.nfs网络文件系统简介 NFS(Network File system&#xff0c;网络文件系统)是由SUN公司研制的UNIX表示层协议&#xff0c;它允许网络中的计算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源&#xff0c;主要在unix系列操作系统上使用。…

【C++】LeetCode:LCR 078. 合并 K 个升序链表

题干&#xff1a; 给定一个链表数组&#xff0c;每个链表都已经按升序排列。 请将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 解法&#xff1a;优先队列 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *ne…

xvisor调试记录

Xvisor是一种开源hypervisor,旨在提供完整、轻量、移植且灵活的虚拟化解决方案,属于type-1类型的虚拟机,可以直接在裸机上启动。 启动xvisor步骤: 1、搭建riscv编译环境 首先从github上下载riscv-gnu-toolchain很费劲,建议直接从国内的源下载 git clone https://gitee…

minGW安装教程

一、下载 1.通过官网WinGW官网下载 http://www.mingw-w64.org 2.通过SourceForge网站下载MinGW https://sourceforge.net/projects/mingw/files/latest/download 二、安装 右键mingw-get-setup.exe&#xff0c;以管理员身份运行 点击Install安装 点击“Change”修改安装地…

BFS入门

目录 定义二叉树层次遍历电梯问题倒可乐BFS基本思想算法 四方访问 定义 BFS 通常是指广度优先搜索&#xff08;Breadth - First Search&#xff09;&#xff0c;它是一种图形数据结构的遍历算法。从给定的起始顶点开始&#xff0c;首先访问起始顶点的所有邻接顶点&#xff0c;然…

【数据库】Oracle

文章目录 1. 批量更新 1. 批量更新 这种方式将所有更新操作放在一个事务中执行&#xff0c;减少了与数据库的交互次数&#xff0c;从而可能提高性能。此外&#xff0c;事务处理还可以确保数据的一致性和完整性。begin; update mytable set STATE 102,STATE_DATE now() …

SQL Server数据库中设置索引的策略

在 SQL Server 中&#xff0c;索引通过加快数据检索速度在优化查询性能方面发挥着关键作用。在数据库中设置索引的策略受数据库结构、表的大小和将要运行的查询类型的影响。索引策略通常涉及考虑维度表、事实数据表、大型表和小型表之间的差异。以下是如何将索引应用于这些不同…

如何将CSDN的文章保存为PDF?

目录 1、打开CSDN文章2、按F12或者鼠标右键选择检查并进入控制台3、在控制台输入以下代码4、然后回车&#xff08;Enter&#xff09;如果纵向显示不全就横向 1、打开CSDN文章 2、按F12或者鼠标右键选择检查并进入控制台 3、在控制台输入以下代码 (function(){ $("#side&q…