剑指 Offer 39. 数组中出现次数超过一半的数字

news/2024/10/18 16:55:19/

🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。
🚁 个人主页:不 良
🔥 系列专栏:🛸剑指 Offer  🛹Linux
📕 学习格言:博观而约取,厚积而薄发
🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同成长! 🌹


剑指 Offer 39. 数组中出现次数超过一半的数字

题目:

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

限制:

1 <= 数组长度 <= 50000

思路一:

要找出在数组中出现次数超过数组长度的一半,可以利用算法库中的sort函数将数组排序后中间的数据就是要找的数据;

再对数组进行遍历统计中间数据出现次数是否超过数组长度一半。

代码如下:

#include <vector>
class Solution {
public:int MoreThanHalfNum_Solution(vector<int> numbers) {sort(numbers.begin(),numbers.end());//先排序int num = numbers[numbers.size()/2];//得到中间数据int count = 0;for(int i = 0; i < numbers.size(); i++) //对数组进行遍历{if(numbers[i] == num){count++;//统计num出现次数}}if(count > numbers.size()/2)//确认是否超过一半return num;return 0;}
};

时间复杂度:O(NlgN)sort函数时间复杂度是O(N*lgN),遍历时间复杂度为O(N)

空间复杂度:O(1)

思路二:

消除不相等的,最后剩下的就是出现次数最多的。

众数:一组数中出现次数最多的那个数;本题中出现次数超过一半的数字就是众数。
如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。如示例中[1, 2, 3, 2, 2, 2, 5, 4, 2],每次消去两个不相同的数字,那么最后剩下的数字2就是出现次数超过一半的。

代码如下:

class Solution {
public:int majorityElement(vector<int>& nums) {if(nums.empty())return 0;//遍历每个元素,并记录次数;若与前一个元素相同,则次数加1,否则次数减1int result = nums[0];int times = 1;//遍历数组,当数组中与result元素相同则++times,否则--timesfor(int i = 1; i < nums.size(); i++){if(times != 0){if(nums[i] == result){++times;}else{--times;}}else{result = nums[i];times = 1;}}   times = 0;for(int i = 0; i < nums.size(); i++){if(nums[i] == result) ++times;}//检查是否超过一半,如果超过则直接返回result,不超过则返回0return (times > nums.size() / 2) ? result : 0;}
};

http://www.ppmy.cn/news/152485.html

相关文章

xps15java_无法在DELL XPS 15(9650)上安装ElementaryOS [关闭]

我刚买了一台带有Windows 10的新戴尔XPS 15(9650)&#xff0c;但我想安装ElementaryOS(https://elementary.io)作为唯一的操作系统(所以我想删除Windows) . 我用Rufus创建了一个可启动的USB&#xff0c;并在BIOS中设置为默认启动选项 . 我得到的屏幕是这样的&#xff1a; 我尝试…

OV9650 移植

作者&#xff1a;冯利美,华清远见嵌入式学院讲师。 一、 移植环境&#xff1a; 【移植环境】 1、 主机&#xff1a;Ubuntu 10.10发行版 2、 目标机&#xff1a;FS_S5PC100平台 3、 交叉编译工具&#xff1a;arm-none-linux-gnueabi-4.5.1 4、 摄像头模块&#xff1a;OV96…

s3c2440 camif接口摄像头驱动分析——基于tq2440的ov9650.c

前言 最近想做摄像头驱动&#xff0c;看了一些文章&#xff0c;对摄像头驱动的结构还是很晕。于是决定分析内核自带的驱动程序。内核的cmos摄像头 有用v4l2的&#xff0c;也有用arm的camif codes通道结构的。本文是针对s3c2440 camif接口而写的驱动的代码导读。写得不好请多多…

ov9650学习(3)

参考了飞凌公司提供的测试源码&#xff0c;自己稍加修改&#xff0c;可以实现摄像头的在LCD上显示 由于飞凌公司提供的测试源码功能很多所以一下子可能不能理解&#xff0c;所以我就想一步步拆开来做&#xff0c;先实现在LCD屏上的显示 ——————————————————…

linux 0v9650驱动分析

学习了裸机OV9650的P通道LCD直接显示程序&#xff0c;作为这点基础开始分析OV9650在linux设备驱动程序。昨天看了点这个驱动程序&#xff0c;让我很郁闷的是写这个程序的人是有毛病还是怎么回事&#xff0c;简简单单的IO口功能引脚的定义&#xff0c;整出了一个套一个的定义&am…

OV9650----摄像头调试笔记

http://blog.chinaunix.net/uid-24486720-id-1664850.html 过4天的调试,摄像头终于可以拍照片保存到电脑上来了&#xff0c;ov9650的调试走了不少弯路&#xff0c;一些教训总结如下&#xff1a; 1:OV9650是OmniVision公司的COMS摄像头&#xff0c;号称有130万像素&#xff0c;…

OV9650摄像头驱动略析

首先要明确一下摄像头工作方式&#xff1a; 一、摄像头是怎么把数据传送给mini2440的呢&#xff1f; 这个摄像头有10个数据口&#xff0c;mini2440通过这些数据口采集摄像头的数据。 二、硬件以什么样的方式交换采集数据呢&#xff1f; 摄像头将采集到的图像数据以一些标准…

ov9650 实时显示app 平台:i.mx6ul linux 3.14.38

本文先简单记录&#xff1a; 1.ov9650采集 摄像头输出yuyv格式 2.写入到framebuffer显示 3.贴yuv2rgb.c的代码如下&#xff1a; tips: 查表法/bpp32 table略 void yuv2rgb(unsigned char *pyuv,unsigned char *prgb,int width, int height){ unsigned char *py p…