题解 |【清晰图解】 #数组中出现次数超过一半的数字#摩尔投票

默认你已经理解题意了哈

思路如下

想象一下,假设一个数组是一个投票箱,数组元素是一张已经写了选举人编号的一张选票

题目上说要求我们找出哪个数字,能够超过了数组的一半呢?

是否就可以想象成,哪个人成为了最终选举的胜利者!

那么,我们接下来要做的事情,就是找到票数最多的那个人的编号就可以了

是不是感觉像这么回事儿,很有精神!

我们可以试着模拟一下,如下所示:

假如我们有个职位,需要从 A,B 两位候选人中选出

先抽出一张票,投的是 A,我们在黑板上写着当前胜利者:A,票数:1
再抽出一张票,投的是 A,我们在黑板上写着当前胜利者:A,票数:2
再抽出一张票,投的是 B,用一张 B 抵消一张 A 的选票,我们在黑板上写着当前胜利者:A,票数:1
再抽出一张票,投的是 B,用一张 B 抵消一张 A 的选票,我们在黑板上写着当前胜利者:无,票数:0
再抽出一张票,投的是 A,我们在黑板上写着当前胜利者:A,票数:1
抽取完毕,恭喜 A 获胜,赢得该职位

演示过程

alt

经过上面例子的分析,可以得出 3 点:

  1. 不同候选人的选票之间,是可以一一抵消
  2. 假如当前胜利者存在多张选票时,不同的候选人的票,只能抵消一张当前胜利者的
  3. 假如当前双方的选票都被抵消为零,那么下一次抽出的候选人,将作为暂时的胜利者并领先

写代码

//JS的代码哦
var majorityElement = function(nums) {
    let ans = 0, count = 0;
    for(let i = 0; i < nums.length; i++){
        if(!count) {
            ans = nums[i];
            count++;
        }else count += nums[i] === ans ? 1 : -1;
    }
    return ans;
};

骚年,作图不容易,留下个赞或评论再走吧 谢啦~,祝你Offer多多哦 💐

全部评论

相关推荐

joe2333:怀念以前大家拿华为当保底的日子
点赞 评论 收藏
分享
小红书 后端开发 总包n+8w+期权
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务