摩尔投票
题目
方法
真简单!
哈希表!计数!return! 完活!
……………………………………
等等,题目要求O(1)空间,这……
核心是对拼消耗
- 我们把这个数组想象成一排士兵,他们来自不同的国家,而且不同国家都是敌对关系,也就是说两两相遇就会开打。
- 假设从左往右进行车轮战,每个士兵的战斗力相同,即敌对士兵两两开打会两败俱死!定义【势力】为某国士兵的个数,即同国士兵相遇会【势力】+ 1
- 当车轮战结束后,最后一定是没有人活着,或者活下来的都是同一国家的
- 那么活下来的势力一定就是参战中势力最雄厚的嘛(指人最多)?不是的,假设总共有2n+1个士兵参战,其中n个属于一方,另n个属于另一方,最后一方势力只有一个人,也许前两方杀红了眼两败俱伤了,最后被剩下的一个人捡漏了也是可能的。
- 怎么判断这个人是捡漏的呢?人不够多。假如【势力】超过总人数的一半,那绝对不会出现捡漏的。
code:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int alive = 0;//活着的人
int type = -1;//因为nums是整数数组所以可以初始化为负值
for(auto& num : nums){
//没有活着的人
if(!alive){
type = num;
alive++;
}else{
if(num == type){
alive++;
}else{
alive--;
}
}
}
if(alive == 0) return -1;
int ans = 0;
for(auto& num : nums){
if(num == type){
ans++;
}
}
return ans > nums.size() / 2 ? type : -1;
}
};