传统艺能😎
小编是双非本科大一菜鸟不赘述,欢迎大佬指点江山(QQ:1319365055)
此前博客点我!点我!请搜索博主 【知晓天空之蓝】
乔乔的gitee代码库(打灰人 )欢迎访问,点我!
过渡区🤣
现在是北京时间20:00,说实话前天看到一道力扣的题,饶有兴趣,基于老毛病,烂到今天才拿来写,这一写不得了,把 ye 整破防了,于是乎打算恭恭敬敬安排一篇博客,多是一件美事~
正片开始👀
概念🤔
嘛是摩尔投票法?
简单来说就是投票法,算法解决的问题是如何在任意多的候选人,选出获得票数最多的那个。常见的算法是扫描一遍选票,也就是遍历,对每个候选人进行统计的选票进行统计。
那我遍历难道不香吗?
这里就要讲一下投票法的过人之处
优点🤔
当执行有序情况时,只要找到中位数,然后检查中位数的个数是否超过选票的一半即可。但是当对象的数目不定时,统计选票可能会执行较长时间,相比原来的时间复杂度 O(n) ,可能需运行 O(n^2) 的时间。
针对无序且对象不定的情况,摩尔投票法应运而生。
算法核心😎
摩尔投票法的关键就是抵消和计数,抵消过程类似于是在进行投票,然后计数我们可以脑补一个情形:当三人中的一人得票数远超其他两人时,我们就可以进行等量对消,消完还有票的自然就是得票数最多的那个,模拟如下:(ppt手残勿喷)
实现😎
基本思路就是由一个计数器维护,在进行比较过程中,不同票消掉,相同票保留,如果消的没有了就直接放进去然后继续上述过程,直到维护对象只剩一个,就是我们要找的最大得票者(众数)。
基于LeetCode真题实践,先看一个初级栗子:
169. 多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例:
输入:[2,2,1,1,1,2,2]
输出:2
来源:力扣(LeetCode)
我最初的思路是哈希思想,qsort 之后用最大的元素 malloc 一块新的空间,桶排后用 count 进行++,最后输出 count 最大的。有点麻烦而且我忽视了一个最大的问题就是负数的存在,垮掉~
根据我们算法的思路,针对目标数组 nums,首先创建一个变量来执行计数器 count 再创建一个新数组 a 进行比对,因为始终是目标数组的内部元素比较,我可以直接把 nums 首元素赋给 a ,比较时从第二个元素开始和 a 比较,如果相同,count ++;不同消掉,count --;没有了就往里拿。
int majorityElement(int* nums, int numsSize){
int count = 1;
int a = nums[0];
for(int i =1;i<numsSize;i++)
{
if(nums[i]==a)
{
count++;
}