# 594.最长和谐子序列

[https://leetcode-cn.com/problems/longest-harmonious-subsequence/](https://leetcode-cn.com/problems/longest-harmonious-subsequence/)

## 哈希

用一个哈希表map，键为num，值为数组，存储num后面与num差值在1以内的数，则这个数组里的元素就是以num开头的最长和谐子序列。一次遍历nums，求map中数组的最长长度即可

但还要注意两点：一是这样收录的`map[num]`中包含num-1、num和num+1，可能不构成和谐子序列。因此考虑用两个哈希表map1和map2，分别存储`[num-1, num]`和`[num, num+1]`范围的数字

二是当数字范围没有波动，也不是和谐子序列，只有一种情况就是map\[num]数组全为num（因为若全是num+1不会收录进map\[num]），因此还要用求和看是否等于len\*num判断

```python
class Solution:
    def findLHS(self, nums: List[int]) -> int:
        map1,map2 = {},{}
 
        for num in nums:
            map1[num] = map1.get(num, []) + [num]
            if num-1 in map1:
                map1[num-1].append(num)
            map2[num] = map2.get(num, []) + [num]
            if num+1 in map2:
                map2[num+1].append(num)

        res = 0
        # 遍历两个哈希表，求最长和谐子序列长度
        for key in map1:
            l = map1[key]
            if sum(l) != key * len(l):
                res = max(res, len(l)) 
        for key in map2:
            l = map2[key]
            if sum(l) != key * len(l):
                res = max(res, len(l)) 
        return res
```
