文章目录
- 1. 题目
- 2. 解题
- 2.1 map+两次扫描
- 2.2 map+一次扫描
1. 题目
和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。
现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。
示例 1:
输入: [1,3,2,2,5,2,3,7]
输出: 5
原因: 最长的和谐数组是:[3,2,2,2,3].
说明: 输入的数组长度最大不超过20,000.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-harmonious-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 map+两次扫描
- 一次扫描计数
- 一次扫描判断前后迭代器key是否相差1,是,则将前后value相加(map是有序的)
class Solution {
public:int findLHS(vector<int>& nums) {if(nums.empty())return 0;map<int,int> m;for(int num:nums)m[num]++;int len = 0;auto it1 = m.begin(), it2 = ++m.begin();for( ; it2 != m.end(); ++it2){if(it1->first+1 == it2->first)len = max(len, it1->second+it2->second);it1 = it2;}return len;}
};
2.2 map+一次扫描
- 扫描到key,其value计数
- 同时检查key-1,key+1,存在否,更新最大长度
class Solution {
public:int findLHS(vector<int>& nums) {if(nums.empty())return 0;map<int,int> m;int len = 0;for(int num:nums){m[num]++;//len = max(len,max(m[num]+m[num-1],m[num]+m[num+1]));//错误//如果相邻的key不存在,答案就错了if(m.count(num-1))len = max(len, m[num]+m[num-1]);if(m.count(num+1) != 0)len = max(len, m[num]+m[num+1]);}return len;}
};