JSMS42-数组中出现次数超过一半的数字-剑指offer29

112 阅读1分钟

题目描述:给定一个数组a然后返回数组a中出现次数大于一半的元素。

解析:这道题,我最初想的是用数组存每个元素出现的次数,通过索引或者哈希的方式,但是这样就要消耗空间复杂度。解析中第二种方法非常值得推荐,也是非常聪明和巧妙的方法,通过一个变量int num;记录数组中的a[x],然后int times;记录出现的次数,当num==a[i]的时候,++times;否则;如果times==0,则换num存放的数,否则times--;具体看代码

#include <stdio.h>
#include <stdlib.h>

int MoreThanHalfNum(int *a,int len)
{
	int times=0;
	int num=a[0];
	int tmp;
	for(int i=1;i<len;i++)
	{
		if(num==a[i])
		{
			++times;
		}else
		{
			if(times==0)
			{
				num=a[i];		
			}else
			{
				times--;	
			}	
		}
	}
	return num;
}

int main()
{
	int a[]={3,1,2,3,1,2,3,1,2,3};
	int len=sizeof(a)/sizeof(a[0]);
	int ret=MoreThanHalfNum(a,len);
	printf("%d\n",ret);
}