BZOJ 2456 mode(找众数)

这篇博客介绍了一道编程题目,要求在给定的数列中找出众数,即出现次数超过序列长度一半的数。解决方案是通过一次遍历,使用四个变量记录当前众数的值、总数、当前值及其出现次数,通过比较更新众数。这种方法在空间限制为1MB的情况下也能正确找到众数。
摘要由CSDN通过智能技术生成

Description

给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数。


Input

第1行一个正整数n。
第2行n个正整数用空格隔开。


Output

一行一个正整数表示那个众数。


Sample Input

5
3 2 3 1 3


Sample Output

3


HINT

100%的数据,n<=500000,数列中每个数<=maxlongint。
zju2132 The Most Frequent Number

Time Limit: 1 Sec
Memory Limit: 1 MB


Solution

一道有趣的题,重点在于空间限制只有1M。
然后不能将所有的数保存,也不能数组计数。
只能读一遍出结果。
我们发现众数出现次数大于其他数出现的总和。假如众数是a,拿a与其他非a数抵消的话,肯定剩下的是a。
于是我们开四个int,n,a,val,cnt。
val代表当前的众数的值,cnt则记录众数出现的次数,若a与val相同则cnt++,否则cnt–。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值