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;
};
posted @ 2020-09-14 22:35  lemon-Xu  阅读(114)  评论(0编辑  收藏  举报