剑指offer39:数组中出现次数超过一半的数字
看到这题,我第一个想法就是,设置一个哈希表,然后统计一下每个数字的出现次数就好了,不过这样需要空间消耗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:数组中出现次数超过一半的数字相关推荐
- python剑指offer数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 8. 返回数组里出现次数最多的数字_剑指offer 数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 剑指_数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 剑指offer-数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 【LeetCode】剑指 Offer 39. 数组中出现次数超过一半的数字
[LeetCode]剑指 Offer 39. 数组中出现次数超过一半的数字 文章目录 [LeetCode]剑指 Offer 39. 数组中出现次数超过一半的数字 一.摩尔投票法 一.摩尔投票法 核心理 ...
- 剑指offer——面试题29:数组中出现次数超过一半的数字
剑指offer--面试题29:数组中出现次数超过一半的数字 Solution1: 20180902日整理 注意几点: 1.若下一个数字和我们之前保存的数字相同,则次数 +1 2.若下一个数字和我们之前 ...
- 剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban ...
- 剑指offer:面试题39. 数组中出现次数超过一半的数字
题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, ...
- 【剑指offer-Java版】29数组中出现次数超过一半的数字
数组中出现次数超过一半的数字 两种思路: 思路一:由于出现次数超过一半,所以如果对这个数组进行划分之后无论如何,位于数组下标 n/2的数字就是出现次数超过一半的数 所以问题就转换为了求划分一次之后 位 ...
最新文章
- 设计模式(策略模式)
- 声学、音乐计算常用工具总结(soundfile、librosa、pydub、madmom、spleeter)
- SQL-字符串运算符和函数
- V记录2(文档)Vue.extend构造器
- ssm上传文件获取路径_SSM实现图片上传下载功能
- 一步步编写操作系统81 att内嵌汇编语法
- zabbix监控工具
- Oracle conn 协议适配器错误解决
- Spring源码下载---导入到Idea
- EL表达式和jstl的简单应用
- MMC多电平变换器matlab/simulink模型
- 如何快速入门PLC编程?
- 新锐任务宝推广渠道推荐
- FFmpeg命令行工具-实用命令
- SQL*Plus中 Set timing on的时间显示单位
- 爬取京东网站前后一星期的笔记本电脑信息并可视化
- 音频codec调试心得
- !!!正则表达式语法
- KMP字符串模式匹配
- TMS320C6748开发视频教程笔记 第12章 通用输入输出口 GPIO