LeetCode 594 最长和谐子序列
1.题目描述:
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
示例 1:
输入:nums = [1,3,2,2,5,2,3,7]
输出:5
解释:最长的和谐子序列是 [3,2,2,2,3]
2.题解:
求最长和谐子序列,本质还是求相差为1的两个元素出现次数,可以又哈希表来计数,哈希表中key时元素,value对应该元素出现的次数
时间复杂度:O(N),其中N是数组的长度;
空间复杂度:O(N), 其中用来存储哈希表的映射。
C++:
class Solution {
public:
int findLHS(vector<int>& nums) {
unordered_map<int, int>cnt ; // 存储每个数字出现的次数
for (auto c : nums) cnt[c]++ ;
int res = 0 ;
for (auto [k, v] : cnt) {
if ( cnt.count(k-1)) {
res = max (res, cnt[k] + cnt[k-1]) ;
}
}
return res ;
}
};
Golang:
func findLHS(nums []int) int {
cnt := map[int]int{}
res := 0
for _, v := range nums {
cnt[v]++
}
for i, _ := range cnt {
if cnt[i-1] !=0 {
res = max (res, cnt[i] + cnt[i-1])
}
}
return res
}
func max (a , b int) int {
if a > b {
return a
}
return b
}
原题:最长和谐子序列