🔶牛客中一道有意思的题,一起来学习摩尔投票法
🍔思路说明:
🌟摩尔投票法:
举例说明:
[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; } };
🌮结语:
🫡你的点赞和关注是作者前进的动力!
🌞最后,作者主页有许多有趣的知识,欢迎大家关注作者,作者会持续更新有意思的代码,在有趣的玩意儿中成长!