594. 最长和谐子序列

482 阅读1分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

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

示例 3:

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

提示:

  • 1 <= nums.length <= 21042 * 10^4
  • -10910^9 <= nums[i] <= 10910^9

解题思路

使用map进行计数,key为数组中的元素,value为对应元素出现的次数,首先遍历一次数组,统计出每个元素的出现次数,因为和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1,而和谐子序列就是在这个基础上 通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。因此我们可以发现我们不需要关心最大值和最小值出现的先后顺序,我们只关心最大值和最小值出现的总次数,又因为最大值和最小值之间的差值刚好为1,因此和谐子序列只由两个元素组成,他们的差值为1,因此我们可以遍历map,枚举所有差值为1的二元组,找出出现总次数最多的二元组,就是最长的和谐子序列

代码


class Solution {
public:
    int findLHS(vector<int> &nums) {

        map<int, int> m;
        int res(0);
        for (int i = 0; i < nums.size(); ++i) {
            m[nums[i]]=m.count(nums[i])?m[nums[i]]+1:1;
        }
        for (auto item:m){
            if (m.count(item.first+1))
            {
                res=max(res,item.second+m[item.first+1]);
            }
        }
        return res;
    }
};