Tango 是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在 Tango上面交流灌水。传说,Tango 有一大“水王”,他不但喜欢发贴,还会回复其他 ID 发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的 ID 也在表中,你能快速找出这个传说中的 Tango 水王吗?

思路:首先想到的是一个最直接的方法,我们可以对所有 ID 进行排序。然后再扫描一遍排好序的 ID 列表,统计各个 ID 出现的次数。如果某个 ID 出现的次数超过总数的一半,那么就输出这个 ID。这个算法的时间复杂度为 ON * log2N + N)。如果 ID 列表已经是有序的,还需要扫描一遍整个列表来统计各个 ID 出现的次数吗?
如果一个 ID 出现的次数超过总数 N 的一半。那么,无论水王的 ID 是什么,这个有序的 ID 列表中的第 N/2 项(从 0 开始编号)一定会是这个 ID(读者可以试着证明一下)。省去重新扫描一遍列表, 可以节省一点算法耗费的时间。如果能够迅速定位到列表的某一项 (比如使用数组来存储列表),除去排序的时间复杂度,后处理需要的时间为 O(1)。但上面两种方法都需要先对 ID 列表进行排序,时间复杂度方面没有本质的改进。能否避免排序呢

如果每次删除两个不同的 ID(不管是否包含“水王”的 ID),那么,在剩下的 ID 列表中,“水王”ID 出现的次数仍然超过总数的一半。看到这一点之后, 就可以通过不断重复这个过程,把 ID 列表中的 ID 总数降低(转化为更小的问题),从而得到问题的答案。新的思路,避免了排序这个耗时的步骤,总的时间复杂度只有 ON),且只需要常数的额外内存。

#include<iostream>
using namespace std;
//类比为一个数组中超过一半的数,求出这个数
template<class T>
T Find(T* a,int size)
{T ret=-1;int time=0;for(int i=0;i<size;++i){if(time==0){ret=a[i];++time;}else{if(ret!=a[i])--time;else++time;}}return ret;
}int main()
{int a[10]={1,5,2,3,5,7,5,5,5,5};cout<<Find(a,10)<<endl;return 0;
}
参照:https://github.com/xiaozhi1995/SmartCode/blob/master/20160511702SearchMidNum/main.cpp

转载于:https://blog.51cto.com/10541556/1828040

求出数组中超过一半的数相关推荐

  1. C语言编程>第二十周 ② 下列给定程序中,函数fun的功能是:求出数组中最大数和次最大数,并把最大数和b[0]中的数对调、次最大数和b[1]中的数对调。

    例题:下列给定程序中,函数fun的功能是:求出数组中最大数和次最大数,并把最大数和b[0]中的数对调.次最大数和b[1]中的数对调. 注意:不要改动main函数,不能增行或删行,也不能更改程序的结构. ...

  2. 求出数组中元素的总和_数组中所有元素的总和可被给定数K整除

    求出数组中元素的总和 This program will help to find out the sum of elements in an array which is divisible by ...

  3. 找出重复的数java_剑指offer:1.找出数组中重复的数(java版)

    数组中重复的数: 题目:找出数组中重复的数, 题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的. 也不知道每个数字重复几次.请找 ...

  4. C语言找出数组中最小的数和它的下标

    C语言找出数组中最小的数和它的下标,然后把它和数组中最前面的元素对换位置 #include <stdio.h> int main() {int A[10]={3,7,5,9,10,2,1, ...

  5. LeetCode 1394. 找出数组中的幸运数(map计数)

    文章目录 1. 题目 2. 解题 2.1 map计数 2.2 Python3解 1. 题目 在整数数组中,如果一个整数的出现频次和它的数值大小相等,我们就称这个整数为「幸运数」. 给你一个整数数组 a ...

  6. LeetCode刷题(61)~找出数组中的幸运数

    题目描述 在整数数组中,如果一个整数的出现频次和它的数值大小相等,我们就称这个整数为「幸运数」. 给你一个整数数组 arr,请你从中找出并返回一个幸运数. 如果数组中存在多个幸运数,只需返回 最大 的 ...

  7. 【C语言学习】 输出数组中最大的数

    一.题目要求,自定义一个数组,要求输出数组中最大的值. 二.解题思路: 1.先求出数组中的长度,也就是数组的个数. 2.编写一个循环,利用数组的长度下标作为限制,进行循环,将较大的值与较小的值进行替换 ...

  8. 找出数组中出现次数超过一半的数

    算法--找出数组中出现次数超过一半的数      每当我看到经典的算法题,就怀念高中,感觉很多算法题就是高中的题目,谁叫哥只读了个专科,高数基本相当没学.      有空要看看高数啊,想当年数学那是相 ...

  9. 求出千位数上的数加百位数上的数等于十位数上的数加个位数上的数的个数cnt,再把所有满足条件的四位数依次存入数组b中,然后对数组b中的四位数按从大到小的顺序进行排序。

    已知数据文件IN13.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数加百位数上的数等于十位数上的数加个位 ...

最新文章

  1. 关于程序中数据库报错“父项未找到”
  2. C语言 | 编程实现3
  3. python线程与进程
  4. MainActivity向子Fragment传值
  5. mysql一些写常用命令
  6. PHPMailer - PHP email transport class
  7. python 单例模式
  8. Label-dependent Feature Extraction in Social Networks for Node Classification
  9. python儿童入门视频-Python入门视频课程
  10. 分布式平台下的HS(High-Security) --Shiro 授权
  11. Linux ubuntu centos Shell命令大全
  12. 渗透第一个靶机 shop1.0 (还是简单渗透版)
  13. HTML页面跳转的5种方法分析介绍
  14. 计算机电子贺卡制作圣诞节,圣诞节电子贺卡怎么制作?
  15. 适合新手的python练习(9)
  16. 区块链大戏上演!陈伟星VS朱啸虎公开互怼数个回合 | 区块链日报
  17. 快速下载||AnotherRedisDesktopManagerMedis-Redis可视化工具
  18. Qt实现多摄像头的识别、显示、截图、分辨率帧率设置等功能
  19. Windows10系统提速优化
  20. git push失败unable to access ‘https://github.com/...‘的解决办法

热门文章

  1. SQL Server 2005 14420 14421错误
  2. 超长干货 | Kubernetes命名空间详解
  3. 微信支付JSAPI掉不起来支付按钮是什么原因?(原创)
  4. Docker的C/S模式
  5. 摆脱设备操作桎梏 汉锐股份教育录播系统解密
  6. Android+Jquery Mobile学习系列(3)-创建Android项目
  7. Fiddler使用AutoResponder进行本地文件和线上文件的映射
  8. 远程密钥登陆linux系统(putty、xshell)
  9. Delphi 解压缩 ZipForge
  10. VMware vSphere 5.1 群集深入解析(二十九)-故障排错