题目描述如下:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
个人思路:
此题目曾经是考研计算机统考命题408中出现过的题目,解析中给出了如下方案:
如果一个数字能够在一个数组中出现的次数大于数组长度的一半,那么它一定会连续出现至少一次。我们可以从这个思路下手。
{1,2,3,2,2,2,5,4,2}就拿这个例子来说明。我们称所要找的元素为主元素并记录为num,将其连续计数设为count。
首先从头开始遍历,如果与记录的主元素一致,则连续计数加一,否则减一,若连续计数变为0,则改变当前主元素为当前所便利的元素。
遍历到1,num=1,count=1;
遍历到2,num=2,count=1;
遍历到3,num=3,count=1;
遍历到2,num=2,count=1;
遍历到2,num=2,count=2;
遍历到2,num=2;count=3;
遍历到5,num=2,count=2;
遍历到4,num=2,count=1;
遍历到2,num=2,count=2;
最后,需要再整体遍历一次数组,以便检查我们所记录的主元素是否出现了大于length/2次。
代码:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int num = 0; //记录当前读取到的数字
int count = 0; //记录连续出现的次数
for(int i = 0; i < numbers.size(); ++i){
if(numbers[i] == num) //num 连续出现
++count;
else //没有连续出现,连续计数减一
--count;
if(count <= 0){
num = numbers[i];
count = 1;
}
}
int sum = 0;
for(int i = 0; i < numbers.size(); ++i){//检查是否为主元素
if(numbers[i] == num)
sum++;
}
return sum>(numbers.size()/2)? num:0;
}