数组中出现次数超过一般的数字
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解题思路
- 因为出现次数超过一半,所以陆续去掉数组中两个不相等的值,则最后剩下的数就是超过一半的数。(可能个数不是1,但都是同一个数)
- 按照上面的思想,用
num
记录当前数(初始为数组第一个数),c
nt
记录出现次数(初始为1) - 遍历数组,如果和
num
相同,cnt+=1
,否则cnt-=1
,如果cnt
减到0,更新num
为当前数字,cnt
置为1 - 最后还要再遍历一遍数组,判断出现次数是否真的超过一半
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.empty()) return 0;
int len=numbers.size();
int num=numbers[0],cnt=1;
for(int i=1;i<len;i++){
if(numbers[i]==num){
cnt++;
}else{
cnt--;
if(cnt==0){
num=numbers[i];
cnt=1;
}
}
}
//验证出现次数是否真的超过一半
cnt=0;
for(int i=0;i<len;i++){
if(numbers[i]==num){
cnt++;
}
}
return cnt>len/2?num:0;
}
};