594. 最长和谐子序列

594. 最长和谐子序列

难度简单225

和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 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 <= 2 * 104
  • -10^9 <= nums[i] <= 10^9

思路1:我们可以枚举最小值x,然后遍历整个数组找到x和x+1的个数,如果个数均不为0,个数和用于更新答案。当然我们也可以对原数组nums进行排序,这样枚举最小值和统计x与x+1的个数都可以加速。

思路2:由于本题是求只且必须至少含有一个x和x+1的子序列,因此x和x+1的出现位置并不重要。我们可以预先统计count[x]表示x出现的次数,然后遍历count数组,如果count[x]与count[x+1]均不为1,就可以更新答案。

        但是由于本题nums[i]的范围很大,因此我们改为哈希表存储,然后枚举键即可~

class Solution {
public:
    int findLHS(vector& nums) {
        unordered_map hash_map;
        int ans = 0, v;
        for(int num:nums){
            hash_map[num] += 1;
        }
        for(unordered_map::iterator iter = hash_map.begin(); iter != hash_map.end(); ++ iter){
            if(hash_map.find(iter -> first + 1) != hash_map.end()){
                ans = max(ans, iter -> second + hash_map[iter -> first + 1]);
            }
        }
        return ans;
    }
};

你可能感兴趣的:(LeetCode刷题,算法)