LeetCode笔记整理1 摩尔投票法
摩尔投票法
主要用途
求众数
时间复杂度O(N), 空间复杂度O(1)
算法思想
每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。
有趣的
核心就是对拼消耗。玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。那就大混战呗,最差所有人都联合起来对付你(对应你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数作为计数器的数),但是只要你们不要内斗,最后肯定你赢。最后能剩下的必定是自己人
实现
2个变量:
e: 众数候选人
count: 计数器, count <= 0, e即将失去候选资格
主体:
遍历整个数组,
- 如果 count = 0, 更换候选人,
- 如果e和当前数字相同count++
- 以上都不成立 count--
最后
- 如果 count > 0, e即为众数,
- 否则没有众数 返回-1
代码
var majorityElement = function(nums) {
var e = -1;
var count = 0;
for(var n of nums){
if(count === 0){
e = n;
++count
} else if(n === e){
++count
} else {
--count
}
}
if(count > 0)
return e;
else
return -1;
};