501.做了几遍,还是没有把所有的情况考虑好。参考代码随想录的答案,一定要搞清楚:1、左中右“中”的时候怎么设置count,即在什么情况下怎么操作count?2、最终目的是把众数放vector,什么时候放?
问题1就是有3种情况:①.cur遍历第一个元素,此时pre是空,那么count代表cur那个元素值的频率,就是1;cur遍历的不是第一个元素,是情况②和③。②.cur和pre的值一样,说明cur还在一组连续的值当中,count应该++。③.cur和pre的值不一样,说明一组连续的值到pre为止了,count应该重置为1,重新从cur现在的值开始。
问题,当cur的值的频率≥maxCount,就应该放进vector。所以又是两种情况。①当你这个count比maxCount还要大的时候,表示更高的频率出现了,maxCount应该更新了。并且现在vector容器放的是以前旧的最高频率众数,应该清空(clear)以前的旧的,然后放新的进来。②如果就等于maxCount的话,说明cur的值的频率仍然是最大的,直接放进去就OK。代码如下:
class Solution {
public:
TreeNode* pre=nullptr;
vector<int> v;
int maxCount=0,count=0;
void traversal(TreeNode* cur){
if(!cur) return ;
traversal(cur->left);
//遍历设置count
if(!pre||pre->val!=cur->val)count=1;
else count++;
//根据count判断
if(count>maxCount){
maxCount=count;
v.clear();
v.push_back(cur->val);
}
else if(count==maxCount)v.push_back(cur->val);
pre=cur;
traversal(cur->right);
}
vector<int> findMode(TreeNode* root) {
traversal(root);
return v;
}
};