感觉面试会考 有两种常规方法,哈希表与排序。但是做不到空间复杂度O1,时间复杂度On。
投票法: 核心思想是,如果我们把众数记为 +1,把其他数记为 −1,将它们全部加起来,显然和大于 0,从结果本身我们可以看出众数比其他数多。
- 选择一个cnt初始化为0,选择一个res
- 遍历数组,如果cnt为0的时候,就选择当前数字作为res
- 若cnt不为0,res=当前数字,cnt++,否则–。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型vector
* @return int整型
*/
int MoreThanHalfNum_Solution(vector<int>& numbers) {
// write code here
int cnt = 0;
int res = numbers.at(0);
for(auto& i : numbers){
if(cnt == 0){
res = i;
cnt++;
}else{
if(res == i) cnt++;
else cnt--;
}
}
return res;
}
};