【牛客】数组中出现次数超过一半的数--摩尔投票法

🔶牛客中一道有意思的题,一起来学习摩尔投票法

🍔思路说明:

🌟摩尔投票法:

举例说明:

[1,2,3,2,2,2,5,4,2](已知其中一个数的长度超过数组长度一半)
🆚现在进行一场选举老大的投票,得票最多的人当老大

前提条件:

根据题目描述我们已知这场投票一定有人可以胜出(一个数的数量大于数组一半)

老大的票数为 n  其他人票数之和为 sum  那么n-sum>0

开始:

因为n-sum>0,所以我们采用不同候选人票数相互抵消的方法

老大候选人有各自的编号,分别是1 2 3 4 5
现在由我们来统计票数

注意:遍历数组的过程中相当于我们一张一张拆开投票纸条

我们只能通过已经拆开的纸条的情况来决定当前谁是老大:

我们以红色框的方式来统计票数

当此时老大票数为0时,下一次我们需要更新老大:

依次继续统计我们即可找出老大:

🔶🔶🔶🔶🔶

思路就是:

遍历数组

编号相同 ++票数

编号不同 --票数

若票数为0 更新候选人

🔶🔶🔶🔶🔶

 🍟代码展示:

💧代码仅供参考奥:

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int>& numbers) 
    {
        // write code here
        //*********摩尔投票法******
        //x为老大
        int x=numbers[0];
        //sum统计票数
        int sum=0;
        for(int i=0;i<numbers.size();i++)
        {
            //票数为0,更新老大
            if(sum==0)
            {
                x=numbers[i];
            }
            
            //编码相同 ++票数
            //编码不同 --票数
            if(numbers[i]==x)
            {
                sum++;
            }
            else 
            {
                sum--;
            }
        }
        //找出老大 
        return x;
    }
};

🌮结语: 

🫡你的点赞和关注是作者前进的动力!

🌞最后,作者主页有许多有趣的知识,欢迎大家关注作者,作者会持续更新有意思的代码,在有趣的玩意儿中成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值