南七星之家 发表于 2024-11-4 21:13:15

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

题目形貌

   调和数组是指一个数组里元素的最大值和最小值之间的差异 恰好是 1 。
给你一个整数数组 nums ,请你在全部大概的子序列中找到最长的调和子序列的长度。 数组的 子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变别的元素的顺序而得到。
示例

示例 1

输入:nums =
输出:5
解释:
最长和谐子序列是 。
示例 2

输入:nums =
输出:2
解释:
最长和谐子序列是 , 和 ,长度都为 2。
示例 3

输入:nums =
输出:0
解释:
不存在和谐子序列。
题解


[*]统计每个数字的出现次数:使用哈希表 countMap 来统计 nums 中每个数字的出现次数。
[*]寻找调和子序列:遍历哈希表中的每个数字,对于每个数字 num,查抄 num + 1 是否也存在于哈希表中。如果存在,则说明找到了一个长度至少为2的调和子序列。将这两个数字的出现次数相加,得到这个子序列的长度,并更新最长调和子序列的长度。
[*]返回结果:返回盘算出的最长调和子序列的长度。
代码实现

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

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

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

    return maxLength;
}
复杂度分析

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【C++刷题】力扣-#594-最长调和子序列