在排序数组中寻找主角数
题目:
在一个已经从小到大排序完成的数组中,若有一个数(可以重复)的重复次数大于整个数组个数的一半,则称这个数为主角数。现要求给定任意排序数组(所有数为正数),若存在主角数则返回这个数,若不存在则返回-1。
分析:
若主角数存在,则有以下特征:
1、主角数至多有一个,比如1,1,3,3,3,3,4中,3是唯一的主角数,理由很简单,因为主角数定义:主角数个数超过总数一半。
2、若主角数存在,则在数组的前一半数字中一定已经出现。理由是因为数字已经排好序,而且主角个数超过总数一半。
3、若主角数存在,则主角数的所在跨度(即这些主角数个数大于数组个数一半),而且他们是紧密相连,因为已经排序完成。
算法:
int halflen = arr.Length/2;
for(int i=0;i<halflen;i++)//只需搜索到前一半
{
if(arr[i]==arr[i + halflen])//直接比较当前数和一半跨度以后的那个数是否相同
{
return arr[i];//该数跨度超过总数一半,所以就是主角数
}
return -1;
}
算法最坏情况是n/2-1次比较