数组中超过出现次数超过一半的数字

Q:题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。


A:如果将数组排序,则相同的数字肯定会在一起,因为该数字的个数超过数组长度的一半,所以该数字组成的子数组肯定会跨过数组的中间位置,所以直接返回arr[n/2]即可。不过这个方法需要先排序。

在考虑另一种方案,如果每次删除两个不同的数字,则在剩下的数组中该数字出现的次数仍然超过一半,所以就把该问题转化为一个规模更小的同类型的问题。


int FindNum(int* arr,int n)
{
	int candidate;
	int cnt=0;
	for(int i=0;i<n;++i)
	{
		if(cnt==0)
		{
			candidate=arr[i];
			cnt++;
		}
		else
		{
			if(candidate==arr[i])
				cnt++;
			else
				cnt--;
		}
	}
	return candidate;
}

posted @ 2012-06-19 16:18  Cavia  阅读(227)  评论(0编辑  收藏  举报