c++中map的特性
刚刚在力扣做题:
https://leetcode-cn.com/problems/longest-harmonious-subsequence/
wa代码是这样的:
class Solution {
public:
unordered_map<int,int> mp;
int findLHS(vector<int>& nums) {
/*
最大最小差别不超过1
既我们可以用哈希表统计出所有取值
然后遍历取值,对于每个取值
ans取max(cnt[val]*(cnt[val+1]?1:0)+cnt[val+1],ans)即可
*/
for(auto it:nums)
mp[it]++;
int ans=0;
for(auto it:mp){
ans=max(it.second*(mp[it.first+1]?1:0)+mp[it.first+1],ans);
}
return ans;
}
};
后来才发现是数组中不存在的数字也被统计到了map中去,为什么会这样呢?
经过实验后发现:
#include<iostream>
#include<map>
#include<unordered_map>
using namespace std;
int main(){
unordered_map<int,int> mp;
cout<<mp[0]<<" ";
cout<<mp.size();
}
该代码输出为0 1,也就是说,我虽然没有往map里添值,但是我查过值(cout<<mp[0]<<" ";这句),只要查过值,无论该值之前是否存在,都会将该值插入进去,为了避免这种情况,我们需要在插入前判断:
if(mp.find(it.first+1)!=mp.end())
然后在执行逻辑就好了!
修改过后,AC了:
class Solution {
public:
map<int,int> mp;
int findLHS(vector<int>& nums) {
/*
最大最小差别不超过1
既我们可以用哈希表统计出所有取值
然后遍历取值,对于每个取值
ans取max(cnt[val]*(cnt[val+1]?1:0)+cnt[val+1],ans)即可
*/
for(auto it:nums)
mp[it]++;
int ans=0;
for(auto it:mp){
if(mp.find(it.first+1)!=mp.end())
ans=max(it.second+mp[it.first+1],ans);
}
return ans;
}
};