剑指Offer - 九度1370 - 数组中出现次数超过一半的数字
2013-11-23 03:55
题目描述:

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

输入:

每个测试案例包括2行:

第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数。

第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]。

输出:

对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1。

样例输入:
9
1 2 3 2 2 2 5 4 2
样例输出:
2
题意分析:
  一个数组中可能有一个数字出现次数超过一半,如果确实有的话,参考《编程之美》上的经典做法。为每个值设置一个“可信度”,当同一个数字连续重复出现时,可信度加1;遇到不同的数时,可信度减1;可信度减到0了就丢弃这个数,换成当前比较的元素。最后剩下的元素就是出现次数超过一半的那个。扫描时间复杂度O(n),空间复杂度O(1)。
  如果没有一个元素出现超过一半,则上面的结果变得不可预测,跟数据顺序、各数据个数有关,因此必须统计每个元素出现的次数,我用了map。时间复杂度O(n * log(n)),空间复杂度O(n)。最终得到的结果元素如果出现次数大于则是有效结果,输出之。否则表示没有元素超过一半,输出-1。
 // 652983    zhuli19901106    1370    Accepted    点击此处查看所有case的执行结果    3272KB    619B    80MS
//
#include <cstdio>
#include <map>
using namespace std; int main()
{
int tmp, ans;
int c;
int i, n;
map<int, int> mm; // must count the number of appearances of every element while(scanf("%d", &n) == ){
mm.clear();
scanf("%d", &ans);
mm[ans] = ;
c = ;
for(i = ; i < n; ++i){
scanf("%d", &tmp);
++mm[tmp];
if(tmp == ans){
++c;
}else{
if(c > ){
--c;
}else{
ans = tmp;
c = ;
}
}
} if(mm[ans] > n / ){
printf("%d\n", ans);
}else{
printf("-1\n");
}
} return ;
}

最新文章

  1. 理解CSS边框border
  2. 总结一下CSS中的定位 Position 属性
  3. EntityFramework 7 Left Join Where is error(Test record)
  4. XUtils框架之初步探索
  5. 用fontAwesome代替网页icon小图标
  6. Office版本差别引发的语法问题
  7. Android测试框架初步
  8. ZOJ 3555 Ice Climber(dp)
  9. Adobe Edge Animate –使用css制作菜单
  10. 【7】JAVA---地址App小软件(AddrBusiness.class)(逻辑层)
  11. JMeter Building a Database Test Plan
  12. 浅谈js中如何动态添加表头/表列/表格内容
  13. Hibernate第九篇【组件映射、继承映射】
  14. 深入java虚拟机学习 -- 内存管理机制
  15. ILMerge在MSBuild与ILMerge在批处理文件中运行
  16. activiti 选人的实现
  17. 洛谷P4843 清理雪道
  18. tp框架中的一些疑点知识-3
  19. Python 中Lambda 表达式 实例解析
  20. 进程监控工具supervisor

热门文章

  1. Bloom Filter (海量数据处理)
  2. TP5.1 配置的获取与设置
  3. 你视为意见领袖的大 V,可能只是个僵尸号
  4. React后台管理系统-品类选择器二级联动组件
  5. Python爬虫,看看我最近博客都写了啥,带你制作高逼格的数据聚合云图
  6. Webpack4 学习笔记五 图片解析、输出的文件划分目录
  7. Golang反射机制
  8. html基础之遗忘篇
  9. python3.X中pickle类的用法(cPickle模块移除了)
  10. delphi的消息对话框