数组中出现次数超过一半的数字
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
有一个很容易理解的方法就是直接排序,如果该数字存在则中间的位置就是该数字。时间复杂度为O(nlgn)
这次主要谈一谈第二种方法。
遍历整个数组,如果下一个值与当前值相等,则计数器+1,若不等,则计数器-1,若计数器为0,则用检测的值赋值给当前值,计数器设1。这样如果该数存在,则最终得到的值就是数组中出现次数最多的值。最后遍历一次数组比对该数的次数若符合要求则为所求值,否则返回0.
代码实现:
class Solution { public: int MoreThanHalfNum_Solution(vector<int> numbers) { int p = numbers[0]; int count = 0; for(int i = 0; i < numbers.size(); ++i){ if(!count){ p = numbers[i]; count = 1; }else if(p - numbers[i]){ --count; }else{ ++count; } } count = 0; for(int i = 0; i < numbers.size(); ++i){ if(p == numbers[i]){ ++count; } } if(count <= numbers.size()/2){ p = 0; } return p; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?