一道叫做majo的问题。。大神们求解答

zhengsy1994 2012-09-09 01:34:04
★实验任务
给定含有n 个元素的多重集合S ={A1,A2,…,An},1<=Ai<=n,1<=i<=n,每个元素在S 中
出现的次数称为该元素的重数。多重集S 中重数大于n/2 的元素称为主元素。
例如,S = {2,2,4,2,1,2,5,2,2,8}。
多重集S 的主元素是2,其重数为6。
现在给定一个n 个元素的多重集合S ={A1,A2,…,An},1<=Ai<=n,1<=i<=n,计算S的主元
素。

★数据输入

输入数据两行。
第一行一个正整数n(1<=n<=400000),表示多重集合S 中元素的个数。
第二行有n个正整数(每两个数字含一个空格)。

★数据输出

若多重集合存在主元素,输出主元素,否则输出0。

输入示例 输出示例
10 2

2 2 4 2 1 2 5 2 2 8




想了很久还是没有想出来= =
希望用C++实现
...全文
153 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sawyer 2012-09-13
  • 打赏
  • 举报
回复
时间复杂度:O(n)空间复杂度O(1)

定义一个变量num,一个变量loc

num用来记录一个数字出现的次数,loc用来记录在数组中的位置

第一步:从头开始遍历数组,loc第一次记录头元素位置,num+1;
第二步:当遍历到与array[loc]不同的元素时,num-1;若num=0,loc等于当前位置的元素位置
第三步:重复上面的过程,直到数组遍历完毕,array[loc]即为所求值

不懂可以看看<编程之美>之“发帖水王”
FancyMouse 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

楼上对于2,1,2,3,2,5,2,7,2貌似无解
感觉最彻底的就是找出重复次数最高的数字并记录其重复次数,最后与n/2比较。
更好的方法没想到
[/Quote]
这时候candidate找到的是最后一个2
baseball11 2012-09-10
  • 打赏
  • 举报
回复
楼上对于2,1,2,3,2,5,2,7,2貌似无解
感觉最彻底的就是找出重复次数最高的数字并记录其重复次数,最后与n/2比较。
更好的方法没想到
FancyMouse 2012-09-09
  • 打赏
  • 举报
回复
性质:删除2个不同的数,如果原数组存在主元素,则它仍然是新数组的主元素。

int majority(int* a, int n)
{
int candidate = a[0], count = 1;
for(int i=1;i<n;i++)
{
if(count == 0) candidate = a[i];
if(a[i] == candidate) count++;
else count--;
}
count = 0;
for(int i=0;i<n;i++)
if(candidate == a[i]) count++;
return count > n/2 ? candidate : 0;
}

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧