数组中出现次数超过一半的数字
时间:2020-03-08
本文章向大家介绍数组中出现次数超过一半的数字,主要包括数组中出现次数超过一半的数字使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
如果不存在则输出0。
思路一: 先排序,排好序之后所有相同的数都在一起了,统计相同的数的个数,并判断个数是吧超过一半
时间复杂度O(nlogn)不是最好的
代码:
class Solution { public: // 先排序,再用计数器统计相同的元素 int MoreThanHalfNum_Solution(vector<int> numbers) { int len = numbers.size(); if (len <= 0) return 0; else if (len == 1) return numbers[0]; // 时间复杂度是o(nlogn)并不是最优的 sort(numbers.begin(), numbers.end()); int count = 1; for(int i = 0; i < len-1; i++) { if (numbers[i] == numbers[i+1]) { count++; } else count = 1; if (count > len/2) return numbers[i]; } return 0; } }
思路二: 时间复杂度是O(n)
如果有符合条件的数字,那么它出现的次数要比其他数字出现的和还要多
所以遍历数组时保存两个值,一个是key为数组中的数字,另一个是times出现的次数
当我们遍历数组时如果下一个数字和之前保存的key值相同则次数加一,
不同时次数减一,当次数为0时,保存当前数字的值,count为1
遍历结束后,保存的数字就是所求的
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 class Solution { 7 public: 8 9 // 思路二: 时间复杂度是O(n) 10 // 如果有符合条件的数字,那么它出现的次数要比其他数字出现的和还要多 11 // 所以遍历数组时保存两个值,一个是key为数组中的数字,另一个是times出现的次数 12 // 当我们遍历数组时如果下一个数字和之前保存的key值相同则次数加一, 13 // 不同时次数减一,当次数为0时,保存当前数字的值,count为1 14 // 遍历结束后,保存的数字就是所求的 15 16 int MoreThanHalfNum_Solution(vector<int> numbers) { 17 int len = numbers.size(); 18 if (len <= 0) 19 return 0; 20 int key = numbers[0]; 21 int times = 1; 22 for(int i = 1; i < len; ++i) 23 { 24 if (key == numbers[i]) 25 ++times; 26 else 27 --times; 28 if (times == 0) 29 { 30 key = numbers[i]; 31 times = 1; 32 } 33 } 34 int count = 0; // 统计key出现的次数 35 for (int i = 0; i < len; i++) 36 { 37 if(key == numbers[i]) 38 count++; 39 } 40 if (count > len/2) 41 return key; 42 else 43 return 0; 44 } 45 }; 46 int main() 47 { 48 Solution s; 49 vector<int> vec ={1,2,3,2,2}; 50 int t = s.MoreThanHalfNum_Solution(vec); 51 cout << t; 52 return 0; 53 }
原文地址:https://www.cnblogs.com/xiaokang01/p/12442525.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Redis中String数据类型原理实现
- Clickhouse分布式集群搭建
- Redis过期策略以及淘汰机制
- 几行代码就可以轻松给你的程序加上进度条
- git禁止在master分支push和commit
- 记录一次mybatis缓存和事务传播行为导致ut挂的排查过程
- appium教程_3.启动appium-server
- appium教程_4.adb常用命令
- Python中的高阶概念属性:五个你应该搞明白的知识点
- 一次奇怪的http状态码改变
- Salesforce LWC学习(二十七) File Upload
- 让我们来谈谈python中的prettyprint和pprint
- vue 开发规范
- Markdown 编写规范
- JavaScript编码规范