数组中寻找主角数

题目:

在一个已经从小到大排序完成的数组中,若有一个数(可以重复)的重复次数大于整个数组个数的一半,则称这个数为主角数。现要求给定任意排序数组(所有数为正数),若存在主角数则返回这个数,若不存在则返回-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次比较

http://www.cnblogs.com/wt616/articles/1628436.html

posted @ 2013-03-15 00:14  小薇林  阅读(140)  评论(0编辑  收藏  举报