出现次数超过一半(50%)的数

 更新时间:2016年07月05日 10:19:29   作者:LJX李家鑫  
给出n个数,需要我们找出出现次数超过一半的数,下面小编给大家分享下我的实现思路及关键代码,感兴趣的朋友一起学习吧

【题目要求】给你n个数与n。现在需要你在O(n)的时间内,O(1)的空间内找出出现次数超过50%的数。

【开始胡扯】一开始我看到这道题瞬间蒙蔽(ToT)/~~~(。﹏。*),要是只有O(n)的时间这一条要求,就可以用哈希瞬间解决(也就是用空间换时间),对于O(1)的空间好像很难解决。

【思路一】双重循环,这是解决这道题效率最低的方法了,也就是对每个数都计算它出现的次数,时间复杂度 O(n^2) 直接Out。

【思路二】先排序,让相近的数字排在一起,然后从第一个数开始遍历,现在给一个例子,如:1000012,现在进行排序:0000112,从0开始,设定一个计数器T=0,现在有4个0,则T=4,发现超过了半数,输出0。这个方法就是上一个方法的优化版,Out。

【思路三】就是以空间换时间,哈希的思想,使一个一维数组有两个含义。比如a[x]=y代表x这个数出现了y次,这个方法时间复杂度是O(n),但是空间实在是……不说了(*  ̄︿ ̄) Out

【思路四】先算出概率,选出这些数中最有可能符合要求的几个数,再随机抽取几个。这……还是算了吧。

【思路五】今天的主题,就是所谓的MJRTY算法,也叫多数投票算法,主要思路如下:(这个算法时间复杂度O(n)!空间上不需要额外的储存,所以空间复杂度是O(1)!!!!!!)

如果count==0,则将vote的值设置为数组的当前元素,将count赋值为1;

否则,如果vote和现在数组元素值相同,则count++,反之count–;

重复上述两步,直到扫描完数组。

count赋值为0,再次从头扫描数组,如果数组元素值与vote的值相同则count++,直到扫描完数组为止。

如果此时count的值大于等于n/2,则返回vote的值,反之则返回-1;

以下是代码实现,由于题目保证结果一定存在,所以我们省去了最后一步的检查验证。

关键代码如下所示:

#include<iostream>
using namespace std;
int len; 
void Find(int* a, int N) 
{
char candidate;
int nTimes, i;
for(i=nTimes=0;i<N;i++)
{
if(nTimes==0) candidate=a[i],nTimes=1;
else
{
if(candidate==a[i]) nTimes++;
else nTimes--;
}
}
cout<<candidate; 
}
int main()
{
cin>>len;
int a[len];
for(int i=0;i<n;i++) cin>>a[i];
Find(a,len);
system("pause");
return 0;
} 

以上所述是小编给大家介绍的出现次数超过一半(50%)的数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • mybatis中使用CASE WHEN关键字报错及解决

    mybatis中使用CASE WHEN关键字报错及解决

    这篇文章主要介绍了mybatis中使用CASE WHEN关键字报错及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Java常见延迟队列的实现方案总结

    Java常见延迟队列的实现方案总结

    Java延迟队列(DelayQueue)是Java并发包中的一个类,它实现了BlockingQueue接口,且其中的元素必须实现Delayed接口,延迟队列中的元素按照延迟时间的长短进行排序,本文给大家介绍了Java常见延迟队列的实现方案总结,需要的朋友可以参考下
    2024-03-03
  • springboot使用hibernate validation对参数校验的实现方法

    springboot使用hibernate validation对参数校验的实现方法

    这篇文章主要介绍了spring-boot 使用hibernate validation对参数进行优雅的校验,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java杂谈之如何消除代码中一大串参数列表

    Java杂谈之如何消除代码中一大串参数列表

    参数列表和字面意思差不多,主要是表示该参数数量不是固定的,可能会有一个参数,可能多个,不管多少个参数,都放到一个数组处理,这种参数叫可变参数。可变长参数要放在最后一个参数位置处理,但是一个函数里面不能有俩种类型的可变参数
    2021-10-10
  • Redis分布式锁实现方式及超时问题解决

    Redis分布式锁实现方式及超时问题解决

    这篇文章主要介绍了Redis分布式锁实现方式及超时问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 解析SpringBoot中使用LoadTimeWeaving技术实现AOP功能

    解析SpringBoot中使用LoadTimeWeaving技术实现AOP功能

    这篇文章主要介绍了SpringBoot中使用LoadTimeWeaving技术实现AOP功能,AOP面向切面编程,通过为目标类织入切面的方式,实现对目标类功能的增强,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Java的Hibernate框架中集合类数据结构的映射编写教程

    Java的Hibernate框架中集合类数据结构的映射编写教程

    Hibernate可以将Java中几个内置的集合结构映射为数据库使用的关系模型,下面我们就来看一下Java的Hibernate框架中集合类数据结构的映射编写教程:
    2016-07-07
  • springboot使用ThreadPoolTaskExecutor多线程批量插入百万级数据的实现方法

    springboot使用ThreadPoolTaskExecutor多线程批量插入百万级数据的实现方法

    这篇文章主要介绍了springboot利用ThreadPoolTaskExecutor多线程批量插入百万级数据,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • Java汉字转拼音案例详解

    Java汉字转拼音案例详解

    这篇文章主要介绍了Java汉字转拼音案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 阿里云主机上安装jdk 某库出现问题的解决方法

    阿里云主机上安装jdk 某库出现问题的解决方法

    今天安装jdk到阿里云服务上,首先看下阿里云是32位还是64位的,如果是32位下载32位的包,如果是64位的下载64位的包,下面与大家分享下安装过程中遇到问题的解决方法
    2013-06-06

最新评论