当前位置: 首页 > article >正文

【C++刷题】力扣-#594-最长和谐子序列

题目描述

和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 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. 统计每个数字的出现次数:使用哈希表 countMap 来统计 nums 中每个数字的出现次数。
  2. 寻找和谐子序列:遍历哈希表中的每个数字,对于每个数字 num,检查 num + 1 是否也存在于哈希表中。如果存在,则说明找到了一个长度至少为2的和谐子序列。将这两个数字的出现次数相加,得到这个子序列的长度,并更新最长和谐子序列的长度。
  3. 返回结果:返回计算出的最长和谐子序列的长度。

代码实现

int findLHS(vector<int>& nums) {
    unordered_map<int, int> countMap;
    unordered_set<int> numSet;

    // 统计每个数字的出现次数并存储在集合中
    for (int num : nums) {
        countMap[num]++;
        numSet.insert(num);
    }

    int maxLength = 0;
    // 遍历集合中的数字,找到最大值和最小值相差为1的两个值
    for (int num : numSet) {
        if (numSet.find(num + 1) != numSet.end()) {
            // 计算子序列的长度
            int length = countMap[num] + countMap[num + 1];
            maxLength = max(maxLength, length);
        }
    }

    return maxLength;
}

复杂度分析

● 时间复杂度:O(n),其中 n 是数组 nums 的长度。我们需要遍历一次数组来构建哈希表和集合,然后遍历集合中的每个元素来计算子序列的长度。
● 空间复杂度:O(n),用于存储哈希表和集合。
这个算法的优势在于它直接使用哈希表来统计数字的出现次数,并通过一次遍历来找到最长和谐子序列的长度。这种方法简单且高效,适用于处理大数据集。


http://www.kler.cn/a/372607.html

相关文章:

  • 我与算法的不期而遇:一场精心策划的技术邂逅
  • 学STM32选标准库还是HAL库?
  • 深入理解所有权与借用——借用与生命周期管理
  • Go语言有哪些常用语句?
  • 【刷题11】CTFHub技能树sql注入系列
  • 数据分析师入门: 数据分析可视化入门知识点
  • vue添加省市区
  • 【Gorm】自定义数据类型
  • MacOS的powermetrics命令查看macbook笔记本的耗能情况,附带查看ANE的工作情况
  • 基于单片机的恒流源技术研究
  • ADS8320E/2K5 数据手册ADS8320一款16位模数转换器 A/D转换器芯片
  • IDEA连接数据库报错(javax.net.ssl.SSLHandshakeException: No appropriate protocol )
  • 使用openssl验证https配置的ssl证书是否可以正常访问
  • CentOS 9 Stream 上安装 Git
  • 分类预测 | GCN图卷积神经网络多特征分类预测(MATLAB)
  • AutoDIR: Automatic All-in-One Image Restoration with Latent Diffusion论文阅读笔记
  • Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记
  • pip install -e .将正在开发的python包安装到虚拟环境中,以便测试和调试。 如果该包有依赖项,pip会自动安装依赖项
  • Mongodb使用视图连接两个集合
  • BackTrader -Indicators 03
  • electron+vite+ts+vue3
  • P8775 [蓝桥杯 2022 省 A] 青蛙过河
  • CUDA环境安装终极指南——Linux(其它系统也一样)
  • 订购 Claude AI 的第二天 它独自完成 文字转语音 flask应用
  • C++ | Leetcode C++题解之第519题随机翻转矩阵
  • 轻型民用无人驾驶航空器安全操控理论培训知识总结-多旋翼部分