数组中超过出现次数超过一半的数字
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;
}
浙公网安备 33010602011771号