原创博文,转载请注明出处!

# 题目

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

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

# 思路

解法一:允许修改输入的数组,时间复杂度为O(n)

解法二:不允许修改输入的数组,时间复杂度为O(n)

  • 原理:

  假设在数组中出现的次数超过数组长度一半的数字位x,x出现的次数比其他所有数字出现的次数的和都要多。设用于存储x的整形变量res,一个用于存储x出现次数的整形变量count。res初始值为number[0],count初始值为1。当遍历到下一个数组元素时,如果当前元素和res相同,则count+1,否则count-1。如果count=0,则保存下一个数字,并设置count=1.

  • 举例:

  res初始值为number[0],即res=1,count=1。遍历整个数组,遍历到number[1],number[1]≠res,count-1为0。因为count=0,设置res=2,count=1,......

# 代码

class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers)
{
if(numbers.empty())
return 0;
else
{
int res = numbers[0];
int cnt = 1; for(int i=1;i<numbers.size();++i)
{
if(numbers[i]==res)
cnt++;
else
cnt--; if(cnt==0)
{
res=numbers[i];
cnt=1;
}
} cnt=0; for(int i=0;i<numbers.size();++i)
{
if(numbers[i]==res)
cnt++;
} if(cnt*2>numbers.size())
return res;
else
return 0;
}
}
};

最新文章

  1. 一个很奇怪的问题,程序没有改动加密参数应该也没有变化.但是两次的加密结果却不一致.md5加密问题
  2. 《Python核心编程》部分代码习题实践(持续更新)
  3. WP老杨解迷:可知评论系统还能勾搭用户呢
  4. js全局变量和局部变量
  5. ruby的在ubuntu上的安装
  6. Kafka 快速起步(作者:杜亦舒)
  7. 乱译文档--开始使用Musca
  8. MKMapView and Zoom Levels: A Visual Guide
  9. IOS传值之代理传值(一)
  10. C# 启动 SQL Server 服务
  11. C# DataTable 转 实体类
  12. Python3.0科学计算学习之绘图(四)
  13. lucene复合条件查询案例——查询name域 或 description域 包含lucene关键字的两种方式
  14. 32.Mysql Cluster
  15. 学习JS的心路历程-类型
  16. Gym-101102-K-Topological Sort
  17. 使用userAgent判断使用的是什么浏览器
  18. 占位符 %s
  19. Android自定义View实现仿QQ实现运动步数效果
  20. ElasticSearch速学 - IK中文分词器远程字典设置

热门文章

  1. Spring cloud + boot 问题记录
  2. jmeter-对响应数据进行unicode转码
  3. HTop 防止进程重复显示
  4. openstack dpdk
  5. Android DB那些事-数据库加密
  6. mac 下测试各种IE版本
  7. python脚本7_打印九九乘法表
  8. 【Demo】CSS3 动画
  9. Java提高篇之常量池
  10. leetcode 559. Maximum Depth of N-ary Tree