【剑指Offer39-数组中出现次数超过一半的数字】

题目:
在这里插入图片描述
这题的哈希表判定和排序找数组中点元素的方法都很好想。

就是这个投票模拟法太秀了:

我们假设每个人写的数字都是一张选票。那么这个要找的就是胜出的人。那么怎么算最快呢?
直接判断相邻数字是否相同就好了
比如3 1 1,一开始假设众数是3,vote(票数)设定为1,但是遇到了1,票数-1.此时已经没有票了。因此需要将众数设定为下一个1,vote设定为1,最后返回这个众数就行了。

再比如,3,3,3,1,1,2,4,3,3一开始假设众数是3,vote设定为1,连续两票3,因此vote = 3。1,1,2抵消了vote的3票,因此众数重置为4,vote重置为1.但是接下来的3又抵消了这一票。于是只剩下3一票了。

在这里插入图片描述
注:当众数的个数刚好为数组长度的一半时,此算法失效。

C++代码附带测试:

#include<iostream>
#include<vector>

using namespace std;

class Solution {
public:
    int majorityElement(vector<int>& nums) {
		int x = nums[0];
		int vote = 1;
		for(int i=1;i<nums.size();i++){
			if(vote==0){
				x = nums[i];
				vote = 1;
				continue;
			}
			if(nums[i]!=x){
				vote--;
			}else{
				vote++;
			}
		}
		return x;
    }
};

int main(){
	vector<int> nums = {3,3,3,1,1,2,4,3};
	Solution solution;
	cout<<solution.majorityElement(nums);
}

补一个摩尔投票法更容易理解的解释:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值