• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

王焘博客

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

在排序数组中寻找主角数

题目:

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

posted on 2009-12-20 21:01  王焘  阅读(293)  评论(7)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3