先看一到入门题,这里k=2
难度简单34
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2
解题思路:
对于一般的k=2,我们都知道需要有一个候选人,其实k>2我们只需要k-1个候选人即可。所以我们可以用k个桶做个hash,存放这k-1个候选人,桶容量够我们就放新的人进去,桶满了要插新的人的时候,我们就对所有的key-1. key == 0时候我们清掉这个key.
class Solution {
public:
int majorityElement(vector<int>& nums) {
int n =nums.size();
int k = 2; //对于任意k 修改这里即可 剑指offer这里为k=2
int bucket = k-1;
map<int,int> mm;
for(auto it:nums){
if(mm.size()<k){mm[it]++;}
else{
vector<int> mv;
for(auto it2:mm){
mm[it2.first]--;
if(mm[it2.first]==0)mv.push_back(it2.first);
}
for(auto it2:mv)mm.erase(it2);
if(mm.size()<k)mm[it]++;
}
}
vector<int> ret;
for(auto it:mm){
int no = it.first;
int cnt=0;
for(int i= 0;i<nums.size();i++)if(nums[i] == it.first)cnt++;
if(cnt>n/k)ret.push_back(it.first);
}
assert(ret.size());
return ret[0]; //对于这道题返回的是第一个元素,对于一般的k返回ret
}
};