594.longest-harmonious-subsequence

本文介绍了一种利用Counter计数器解决寻找最长和谐子序列问题的方法。和谐子序列定义为数组中最大值与最小值之差为1的子序列。通过示例说明了如何找出给定数组中最长的和谐子序列。

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

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

示例 1:

输入: [1,3,2,2,5,2,3,7]
输出: 5
原因: 最长的和谐数组是:[3,2,2,2,3].

说明: 输入的数组长度最大不超过20,000.


解题思路:

    使用counter来计数。

解题代码:

        ans=0
        d=collections.Counter(nums)
        for num in nums:
            if num+1 in d:
                ans=max(ans,d[num]+d[num+1])
        return ans

这段代码是用于解决一个名为“最长和谐子序列”(Longest Harmonious Subsequence)的问题。问题的大意是:给定一个整数数组 `nums`,找出其中由两个相差恰好 1 的不同数字组成的最长子序列的长度。 ### 代码逐行解释: ```cpp class Solution { public: int findLHS(vector<int>& nums) { ``` - 定义了一个类 `Solution`,面有一个成员函数 `findLHS`,该函数接收一个整型向量 `nums` 作为参数。 - 函数返回的是最长的和谐子序列的长度。 ```cpp unordered_map<int, int> cnt; int res = 0; ``` - 使用 `unordered_map` 创建一个哈希表 `cnt`,用来统计每个数字出现的次数。 - `res` 是结果变量,初始化为 0,表示目前找到的最长和谐子序列的长度。 ```cpp for (int num : nums) { cnt[num]++; } ``` - 遍历整个数组 `nums`,统计每个数字出现的次数,并存储在哈希表 `cnt` 中。 ```cpp for (auto [key, val] : cnt) { ``` - 遍历哈希表中的每一个键值对 `(key, val)`,其中 `key` 是数组中出现过的某个数字,`val` 是它出现的次数。 ```cpp if (cnt.count(key + 1)) { res = max(res, val + cnt[key + 1]); } ``` - 如果当前键 `key` 的下一个数 `key + 1` 也在哈希表中存在,说明这两个数可以组成一个和谐子序列。 - 计算这两个数总共出现的次数 `val + cnt[key + 1]`,并更新最大值 `res`。 ```cpp return res; } }; ``` - 最后返回结果 `res`,即最长的和谐子序列的长度。 --- ### 示例: 输入:`nums = [1,3,2,2,5,2,3,7]` 输出:`5` 解释:最长的和谐子序列为 `[3,2,2,3]` 或 `[2,3,2,3]` 等,长度为 4 个 2 3 的组合。 --- ### 时间复杂度分析: - 第一次遍历统计频率:O(n) - 第二次遍历哈希表:O(m),其中 m 是不同数字的数量,最坏情况下是 O(n) - 总体时间复杂度为 **O(n)** --- ### 空间复杂度分析: - 使用了哈希表来存储数字出现的次数,空间复杂度为 **O(n)** ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值