看到这题,我第一个想法就是,设置一个哈希表,然后统计一下每个数字的出现次数就好了,不过这样需要空间消耗O(n),时间上的复杂度应该是O(n)。不过这样能行吗,题目中没有给我数字范围,怎么设置数组大小呢?噢,有unordered_map啊,那没事了。

思路如下:

设置一个unordered_map<int,int>的counts用来对nums中的每一个数字的出现次数进行计数

设置一个majority保存当前最大计数的对应数字,一个cnt保存当前最大计数

这样,遍历一遍nums就解决了

代码如下所示:

class Solution {
public:int majorityElement(vector<int>& nums) {unordered_map<int, int> counts;int majority = 0, cnt = 0;for (int num: nums) {++counts[num];if (counts[num] > cnt) {majority = num;cnt = counts[num];}}return majority;}
};作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-pvh8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

好像有的面试官喜欢恶心人是吧,说什么不准有额外空间开销,那我们可以从排序的角度来看这个问题,我们可以这样想,如果这个数字是最小的,由于他的出现次数超过长度的一半,那排完序后,那这个最小数的最大下标也是超过了一半的位置的下标的,同理如果这个数字是最大的,那最小的下标也是比一半的位置小的,换句话说,排完序后中间位置肯定在这个数字的下标范围之内。

我们可以用经典的快排来解决,空间开销是O(1),时间复杂度是(nlogn)正好练练手:

思路如下:

选定一个中心元素(这里取数组的最左元素),设置两个指针l,r,l用于从左至右找到比中心元素大的元素的下标,r相反,然后交换对应元素位置。

划分之后的数组的情况应该是这样的:

中心元素 比中心元素小 比中心元素大

这里边l结束时应当已经指向了比中心元素大的部分而r指向小的一部分,即l>=r,这里的等号是可能有等于中心元素的元素的出现

class Solution {
public:int majorityElement(vector<int>& nums) {int len=nums.size();int mid=len>>1;quickSort(nums,0,len-1,mid);return nums[len/2];}void quickSort(vector<int>& nums,int left,int right,int &mid){if(left>=right){return;}int index=partition(nums,left,right);if(index==mid) return;else if(index<mid) return quickSort(nums,index+1,right,mid);else return quickSort(nums,left,index-1,mid);}int partition(vector<int>& nums,int left,int right){int pivot=nums[left];int l=left,r=right+1;while(true){while(l<right&&nums[++l]<pivot);while(r>left&&nums[--r]>pivot);if(l>=r){break;}swap(nums[l],nums[r]);}swap(nums[left],nums[r]);return r;}};

当然,有的人会说,有sort为啥不用呢?肯定是可以用的:

class Solution {
public:int majorityElement(vector<int>& nums) {sort(nums.begin(), nums.end());return nums[nums.size() / 2];}
};作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-pvh8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

额,不过我不懂这个结果为什么内存消耗还大一些,可能是中间变量?

官方题解的摩尔投票答案好像更加神奇来着,用了个什么摩尔投票法,emmm了解一下:

看完之后感觉:数学世界真精彩。。。。。。看的十分模糊,似懂非懂。。。。。。但是好像确实是这样。。。。。。

链接如下:

力扣

额,也cv一下吧:

class Solution {
public:int majorityElement(vector<int>& nums) {unordered_map<int, int> counts;int majority = 0, cnt = 0;for (int num: nums) {++counts[num];if (counts[num] > cnt) {majority = num;cnt = counts[num];}}return majority;}
};

剑指offer39:数组中出现次数超过一半的数字相关推荐

  1. python剑指offer数组中出现次数超过一半的数字

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

  2. 8. 返回数组里出现次数最多的数字_剑指offer 数组中出现次数超过一半的数字

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

  3. 剑指_数组中出现次数超过一半的数字

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

  4. 剑指offer-数组中出现次数超过一半的数字

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

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

    [LeetCode]剑指 Offer 39. 数组中出现次数超过一半的数字 文章目录 [LeetCode]剑指 Offer 39. 数组中出现次数超过一半的数字 一.摩尔投票法 一.摩尔投票法 核心理 ...

  6. 剑指offer——面试题29:数组中出现次数超过一半的数字

    剑指offer--面试题29:数组中出现次数超过一半的数字 Solution1: 20180902日整理 注意几点: 1.若下一个数字和我们之前保存的数字相同,则次数 +1 2.若下一个数字和我们之前 ...

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

    剑指 Offer 39. 数组中出现次数超过一半的数字https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban ...

  8. 剑指offer:面试题39. 数组中出现次数超过一半的数字

    题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, ...

  9. 【剑指offer-Java版】29数组中出现次数超过一半的数字

    数组中出现次数超过一半的数字 两种思路: 思路一:由于出现次数超过一半,所以如果对这个数组进行划分之后无论如何,位于数组下标 n/2的数字就是出现次数超过一半的数 所以问题就转换为了求划分一次之后 位 ...

最新文章

  1. 设计模式(策略模式)
  2. 声学、音乐计算常用工具总结(soundfile、librosa、pydub、madmom、spleeter)
  3. SQL-字符串运算符和函数
  4. V记录2(文档)Vue.extend构造器
  5. ssm上传文件获取路径_SSM实现图片上传下载功能
  6. 一步步编写操作系统81 att内嵌汇编语法
  7. zabbix监控工具
  8. Oracle conn 协议适配器错误解决
  9. Spring源码下载---导入到Idea
  10. EL表达式和jstl的简单应用
  11. MMC多电平变换器matlab/simulink模型
  12. 如何快速入门PLC编程?
  13. 新锐任务宝推广渠道推荐
  14. FFmpeg命令行工具-实用命令
  15. SQL*Plus中 Set timing on的时间显示单位
  16. 爬取京东网站前后一星期的笔记本电脑信息并可视化
  17. 音频codec调试心得
  18. !!!正则表达式语法
  19. KMP字符串模式匹配
  20. TMS320C6748开发视频教程笔记 第12章 通用输入输出口 GPIO

热门文章

  1. 2021年哔哩哔哩Java高级面试题及答案,面试必问!
  2. 类打地鼠canvas小游戏
  3. golang go语言_Go(Golang)编程语言
  4. Centos7 安装 net - tools
  5. Android vivo手机安装失败的解决方式
  6. 《老路用得上的商学课》61-70学习笔记
  7. 未能加载文件或程序集“Pechkin”或它的某一个依赖项
  8. php允许上传的文件后羿_后羿SEO:浅谈seo外链建设需要注意的几个问题!
  9. 第十章 Executor框架
  10. 互联网科普-什么是天猫