问题描述:
给定一个整型数组,找出主元素,它在数组中的出现次数大于数组元素个数的二分之一。
思路:
最简单粗暴的方法是对每一个元素查找出现次数,但这样时间复杂度太高。
更好的方法是,从第一个元素nums[0]开始,令变量res=nums[0], 记其出现次数为cnt=1;
此后若出现相同元素则cnt+1,否则cnt-1。
若查找到第i个元素时cnt<0则令res=nums[i],cnt=1。
在查找过程中若cnt>(size/2)则返回res。
若数据分布较为均匀,即查找过程中cnt总小于(size/2),由于主元素数量超过其他元素数量之和,最后剩下的res也一定是主元素,最后返回res。
代码实现:
int majorityNumber(vector<int> &nums) {
int size = nums.size();
int cnt = 0;
int res = 0;
for(int i=0; i<size; i++){
if(nums[i] == res){
cnt++;
}
else{
cnt--;
}
if(cnt<0){
res = nums[i];
cnt = 1;
}
else if(cnt>(size/2)){
return res;
}
}
return res;
}