思路:
是要找的元素,计数器加一,不是则减一,当计数器为0,说明相同的元素个数已经被不同元素个数抵消完,则换下一个元素,最后剩下的就是最多的那个数字
相当于不断从数组里删除不同的两个数(不管包不包含要找的过半数),到最后剩下的将全是相同的数字了,即要找的数字
#include<stdio.h>
int main(void)
{
int arr[]={1,1,1,1,1,8,2,2,2};
int n=sizeof(arr)/sizeof(int);
int i,j;
int a=0,b=0;//a用来记录数组中的数字,b记录该数字出现的次数
for(i=0;i<n;i++)
{
if(arr[i]==a) //①当前数组元素与a相等,先假设要找的数就是数组当前元素,把它存在a中。给b加一
{
a=arr[i];
b++;
}
else// ②当前数组元素与a不相等 。分两种情况
{
if(b>0) b--; //第一种:b大于0,给b减一
if(b==0) //第二种:b=0,说明前面不同的数的个数已经把相同的元素的个数抵消完了,则换下一个元素
{
a=arr[i];
b=1;
}
}
}
printf("%d \n",a);
}