题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
这一题仔细阅读题目意思就会发现,主要就是找众数,并且题目中明确告知,给出的数组中必然有出现次数超过n/2的元素。
那就很简单了,有一个很偷懒的方法,对数组进行排序,那么第n/2个元素必然是众数。
这也太简单了,只需要两行代码
public int majorityElement(int[] nums) {Arrays.sort(nums);return nums[nums.length/2];}
但是,有没有更快的方法?当然有,接下来就是本篇题解的重点------摩尔投票
这个算法很好理解,首先我们要明确两个推论
- 当令众数的key值为1,非众数的key值为-1时,整个数组所有的key值相加必然是大于0的
- 在遍历数组的过程中,若出现下标为a时,key值为0,那么(n-a)中所有key值相加必然大于0,也就是说在(n-a)的部分中众数任然不变
那么我们就只要在遍历数组的时候,判断当前key值之和sum是否为0,为0则更新总数x;
不为0则判断当前元素和x是否相等,相等则sum++,反之则sum--;
数组遍历结束之和,返回x即可。
public int majorityElement(int[] nums) {int k=nums[0], m=1;for(int i=1;i< nums.length;i++){if(m==0){k=nums[i];}if(nums[i]==k){m++;}else{m--;}}return k;}