算法-每日一题(DAY12)最长和谐子序列

1.题目链接:

594. 最长和谐子序列 - 力扣(LeetCode)

2.题目描述:

和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。

给你一个整数数组 nums ,请你在所有可能的 子序列 中找到最长的和谐子序列的长度。

数组的 子序列 是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。

示例 1:

输入:nums = [1,3,2,2,5,2,3,7]输出:5

解释:

最长和谐子序列是 [3,2,2,2,3]

示例 2:

输入:nums = [1,2,3,4]输出:2

解释:

最长和谐子序列是 [1,2][2,3] 和 [3,4],长度都为 2。

示例 3:

输入:nums = [1,1,1,1]输出:0

解释:

不存在和谐子序列。

提示:

1 <= nums.length <= 2 * 104
-109 <= nums[i] <= 109

3.解题思路:

我们可以通过哈希表的方式,利用元素频率统计来求解数组中的最长和谐子序列。首先,创建一个哈希表 cnt 来记录每个数字在数组中的出现频次。接着,遍历 nums 数组,对于每一个数字 num,将其在 cnt 中的计数加 1。然后,遍历哈希表中的每一个键值对,检查是否存在一个比当前键大 1 的数字。如果存在这样的数字,说明这两个数字可以组成一个和谐子序列,此时更新最大和谐子序列的长度 res,即更新为当前和谐子序列长度 val + cnt[key + 1] 的较大值。最后,返回最长的和谐子序列长度 res。通过这种方式,代码实现了高效的查找和更新,从而得到数组中最长和谐子序列的长度。

4.题解代码:

class Solution {
public:int findLHS(vector<int>& nums) {unordered_map<int, int>cnt;//创建哈希表cntint res = 0;//定义一个变量res,用于储存最终的子序列长度for (int num : nums)//遍历 nums 数组中的每一个元素 num,将其作为键{cnt[num]++;//增加 cnt[num] 的计数。即统计每个数字在 nums 中出现的频率   }for (auto [key, val] : cnt)//遍历 cnt 中的每一个键值对,key 记录数组中的数字,val 是该数字出现的次数{if (cnt.count(key + 1))//判断 cnt 中是否存在键为 key + 1 的项。如果存在,说明 key 和 key + 1 的数字可以组成一个和谐子序列,因为它们之间的差值正好是 1{res = max(res, val + cnt[key + 1]);//如果存在 key + 1 ,则更新res,确保它的值是最长和谐子序列的长度}}return res;//返回 res,即数组 nums 中最长和谐子序列的长度}
};

5.示例演算:

输入:[1,3,2,2,5,2,3,7]

执行步骤cnt 内容当前 key检查 key+1计算长度res 更新
初始化后{}---0
处理元素 `
1`{1:1}---0
处理元素 `
3`{1:1, 3:1}---0
处理元素 `
2`{1:1, 2:1, 3:1}---0
处理元素 `
2`{1:1, 2:2, 3:1}---0
处理元素 `
5`{1:1, 2:2, 3:1, 5:1}---0
处理元素 `
2`{1:1, 2:3, 3:1, 5:1}---0
处理元素 `
3`{1:1, 2:3, 3:2, 5:1}---0
处理元素 `
7`{1:1, 2:3, 3:2, 5:1, 7:1}---0
遍历 key=1不变1存在 (key=2)1+3=44
遍历 key=2不变2存在 (key=3)3+2=55
遍历 key=3不变3不存在 (key=4)-5
遍历 key=5不变5不存在 (key=6)-5
遍历 key=7不变7不存在 (key=8)-5
最终结果5

6.复杂度计算:

时间复杂度:需要遍历一次 nums 数组和哈希表中的每个元素,故时间复杂度为O(n)

空间复杂度:我们使用了一个哈希表来存储数组中每个不同元素的频次,最坏情况下哈希表的大小为n,故空间复杂度为O(n)

7.拓展:

双指针解法:

通过两个指针begin和end来找出数组中和谐序列的最大长度。

首先,数组排序,以便相同的元素聚集在一起。然后,初始化begin为0,res为0,表示和谐序列的最大长度。接下来,通过一个for循环遍历数组,end指针从头到尾逐一检查每个元素。在每次循环中,begin指针会向右移动,直到满足nums[end] - nums[begin] <= 1的条件,这样保证了当前窗口内的最大值和最小值之差不超过1。若nums[end] - nums[begin] == 1,则计算当前窗口的长度end - begin + 1,并更新res为最大值。最终返回最大和谐序列的长度res。通过这种方式,代码高效地查找和更新符合条件的最长和谐子序列的长度。

class Solution {
public:int findLHS(vector<int>& nums) {sort(nums.begin(), nums.end());  // 排序预处理,使相邻元素更容易比较int begin = 0;  // 定义滑动窗口的左指针,初始化为数组的第一个元素int res = 0;    // 初始化最大和谐序列的长度为0for (int end = 0; end < nums.size(); end++) {  // 右指针从头到尾遍历整个数组// 当窗口中最大值与最小值的差大于1时,缩小窗口while (nums[end] - nums[begin] > 1) {begin++;  // 左指针右移,缩小窗口,直到满足条件}// 如果当前窗口中的最大值与最小值的差正好为1,说明找到了一个和谐序列if (nums[end] - nums[begin] == 1) {res = max(res, end - begin + 1);  // 更新和谐序列的最大长度}}return res;  // 返回找到的最大和谐序列的长度}
};

双指针解法的空间效率更高,而哈希表解法的时间效率更高。

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

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

相关文章

阿里云-云效自动部署spring boot项目

1.使用云效通过docker自动部署spring boot项目 1.1 spring boot项目配置 # 阿里云的jdk17镜像 FROM registry.cn-zhangjiakou.aliyuncs.com/publicci/openjdk:17-jdk-alpineENV APP_HOME /home/admin/app/# 将target/arms-application.jar 复制到容器中 /home/admin/app/app.…

SQL篇 添加约束、删除约束

SQL篇 添加约束、删除约束 1、相关链接2、约束的增删找查2.1 查看约束&#xff08;主键、外键、唯一性、检查约束&#xff09;2.2 查看默认约束2.3 修改约束&#xff08;添加/编辑/修改&#xff09;2.3.1 添加主键约束2.3.2 添加外键约束2.3.3 添加唯一性约束2.3.4 添加检查约束…

Python PyTorch 深度学习库 包 timm

文章目录 &#x1f4e6; 主要特点&#x1f680; 安装方式&#x1f9ea; 使用示例示例1&#xff1a;加载一个预训练模型进行图像分类示例2&#xff1a;获取模型结构信息 &#x1f310; 官方资源&#x1f50d; 常见用途✅ 优势总结 Timm 是一个非常流行且功能强大的 Python 深度学…

tree 命令集成到 Git Bash:可视化目录结构的指南

目录 1. 下载与准备 tree 工具   2. 集成 tree 到 Git Bash 环境   3. tree 命令基础用法详解   4. 使用示例 在软件开发和文件管理中&#xff0c;清晰的目录结构可视化是提高效率的重要手段。tree命令作为 UNIX/Linux 系统的标准工具&#xff0c;能以树形结构递归展…

如何搭建基于RK3588的边缘服务器集群?支持12个RK3588云手机

以下是基于RK3588搭建边缘服务器集群的完整实施方案&#xff0c;涵盖硬件选型、集群架构、软件部署及优化要点&#xff1a; &#x1f5a5;️ ‌一、硬件集群架构设计‌ ‌节点基础配置‌ ‌核心单元‌&#xff1a;单节点采用RK3588核心板&#xff08;4A762.4GHz 4A551.8GHz&am…

飞算 JavaAI:我的编程强力助推引擎

文章目录 引言&#xff1a;当Java开发遇上AI助手初识飞算JavaAI&#xff1a;专为Java而生的智能伴侣安装与配置&#xff1a;轻松上手的开始核心功能体验&#xff1a;从需求到代码的全流程革命1. 智能需求分析与拆解2. 智能接口设计3. 表结构智能生成4. 处理逻辑自动梳理5. 高质…

飞算JavaAI—AI编程助手 | 编程领域的‘高科技指南针’,精准导航开发!

目录 一、引言 1.1 什么是飞算JavaAI&#xff1f; 1.2 告别"996的孤独感"&#xff1a;AI成为你的编码搭子 1.3 成就感加速器&#xff1a;从"能运行"到"优雅实现" 1.4 极简下载体验&#xff1a;3步开启"开挂"模式 二、深入体验飞…

NPM组件 betsson 等窃取主机敏感信息

【高危】NPM组件 betsson 等窃取主机敏感信息 漏洞描述 当用户安装受影响版本的 betsson 组件包时会窃取用户的主机名、用户名、工作目录、IP地址等信息并发送到攻击者可控的服务器地址。 MPS编号MPS-2nrw-lifd处置建议强烈建议修复发现时间2025-06-30投毒仓库npm投毒类型主…

Apipost 与 Apifox:API 开发管理中的 AI 能力对比

在当今竞争激烈的 API 开发与测试领域&#xff0c;效率与质量是衡量工具优劣的关键指标。Apipost 凭借其强大的 AI 功能&#xff0c;为开发者和测试人员带来了前所未有的便利&#xff0c;而 Apifox 作为该领域的重要参与者&#xff0c;二者在实际应用中究竟有何差异&#xff1f…

Electron 菜单栏深度定制指南:从基础到高级实践

在现代桌面应用开发中&#xff0c;菜单栏作为用户界面的重要组成部分&#xff0c;不仅提供了应用功能的快速访问途径&#xff0c;还直接影响着用户的操作体验。Electron 作为跨平台桌面应用开发框架&#xff0c;为开发者提供了强大而灵活的菜单系统定制能力。本文将全面介绍 El…

QML通过XMLHttpRequest实现HTTP通信

转自个人博客 由于 QML 的 JavaScript 兼容性&#xff0c;我们可以直接使用 JavaScript 的 XMLHttpRequest 对象进行 HTTP 请求。QML 的 XMLHttpRequest 实现与标准浏览器的实现非常相似&#xff0c;但有一些限制和特殊行为需要注意。 而QML实现TCP等其他通信一般就需要借助Qt与…

Spring Boot 内置反向代理(Undertow Proxy)高可用配置

引言 在微服务架构中&#xff0c;反向代理是一个不可或缺的组件&#xff0c;它负责请求转发、负载均衡、安全过滤等关键功能。 通常我们会选择 Nginx、HAProxy 等专业反向代理组件&#xff0c;但在某些场景下&#xff0c;使用 Spring Boot 内置的反向代理功能可以简化架构&am…

ClickHouse 部署

Docker 部署 1、拉取镜像 docker pull clickhouse/clickhouse-server:latest单机版本部署 编写docker-compose.yml version: 3services:clickhouse-server:image: clickhouse/clickhouse-server:22.12container_name: clickhouse-serverports:- "8123:8123"ulimit…

Fiddler中文版抓包工具如何帮助前端开发者高效调试

前端开发早已不再是“写好页面就完事”的工作。随着业务复杂度提升&#xff0c;前端开发者需要直面接口联调、性能优化、跨域排查、HTTPS调试等一系列和网络请求紧密相关的任务。抓包工具成为这些环节中不可替代的得力助手&#xff0c;而 Fiddler抓包工具 因其全面的功能和灵活…

WTL 之trunk技术学习

相比于MFC的消息机制&#xff0c;WTL/ATL的实现更加优雅。后者将win32 API与面向对象技术完美地结合起来&#xff0c;去掉了庞杂的MFC依赖&#xff0c;生成的软件体积更小&#xff0c;运行速度更快。在其中&#xff0c;如何将窗口函数转变为对窗口对象成员函数的调用&#xff0…

Linux——11.软件安装与包管理

Linux 与 Windows 系统在软件安装方式上的差异 Linux: Linux 通过 包管理系统(如 Debian 的 apt、Red Hat 的 yum/dnf)将软件打包为二进制安装包(如 .deb、.rpm),每个包包含程序文件、依赖关系和元数据。包管理系统负责统一管理软件的安装、更新、卸载,并自动处理依赖关…

无人机用shell远程登录机载电脑,每次需要环境配置原因

原因&#xff1a; 终端分为“登录 shell”和“非登录 shell”&#xff1a; - 登录 shell&#xff08;如开机登录、远程 SSH 连接&#xff09;会加载 .profile 或 .bash_profile 。 - 非登录 shell&#xff08;如打开新终端窗口&#xff09;会加载 .bashrc 。 - 如果环境变量…

HarmonyOS5 折叠屏适配测试:验证APP在展开/折叠状态下的界面自适应,以及会出现的问题

以下是HarmonyOS5折叠屏应用在展开/折叠状态下的UI自适应测试方案及技术实现要点&#xff1a; 一、核心测试维度 ‌状态连续性验证‌ 页面滚动位置保持&#xff08;需通过display.on(foldStatusChange)监听状态并保存/恢复滚动位置&#xff09;输入内容保留&#xff08;使用…

Introduction to Software Engineering(TE)

Program Design Language 也称为&#xff1a;伪代码语言&#xff08;Pseudo-code Language&#xff09; PDL 的同类&#xff08;或相关替代&#xff09; 名称简介是否代码结构化流程图 (Flowchart)用图形方式描述处理逻辑✅伪代码 (Pseudo-code)通用术语&#xff0c;PDL就是…

DM8数据库入门到熟练

1、部署 1.1、下载 用户在安装 DM 数据库之前需要检查或修改操作系统的配置&#xff0c;以保证 DM 数据库能够正确安装和运行。 操作系统CPU数据库CentOS7x86_64dm8_20250506_x86_rh7_64.zip 1.2、新建 dmdba 用户 安装前必须创建 dmdba 用户&#xff0c;禁止使用 root 用户…