剑指offer39-数组中出现次数超过一半的数字
Posted yumoz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer39-数组中出现次数超过一半的数字相关的知识,希望对你有一定的参考价值。
文章目录
1 题目
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。假设这个数组是非空的,并且给定的数组总是存在多数元素。
2 题解
要找出数组中出现次数,超过一半的数字,那么有下面方法:
2.1 统计每个数的出现次数
- 白能量count = 1;记录数字出现次数。
- 先找数组中第一个元素numbers[0]作为开始,并记为curNum;
- 遍历数组,若有等于curNum的数,count++;否则继续遍历数组元素的下一个。
参考代码:
class Solution
public:
int MoreThanHalfNum_Solution(vector<int> numbers)
int len = numbers.size();
int curNum = numbers[0];
int count = 1; //统计出现多少次
for(int i = 1;i<numbers.size();++i)
if(numbers[i] == curNum) count++;
else
count--;
if(count == 0)
//若第一个数不是,那么继续找数组下一位
curNum = numbers[i];
count = 1;
return curNum;
;
2.2 排序,取中间值
- 对数组元素排序,取中间值,记为middle;
- 遍历比较数组中元素和middle的值,相等 count++;(count初值为0)
- 判断,若count(出现次数 > numbers.size()/2 )则返回middle,否则返回0;
参考代码:
class Solution
public:
int majorityElement(vector<int>& nums)
if(nums.empty()) return 0;//数组为空,返回0;
sort(nums.begin(),nums.end());//排序
int middle = nums[nums.size()/2];//取中间
int count = 0;
for(int i = 0; i<nums.size(); ++i)
if(nums[i] == middle)
++count;
return (count > nums.size() / 2) ? middle : 0;
;
2.3 直接返回排序后数组中间值
因为数组出现次数超过一半,所以排序后数组中间值肯定为此出现次数超过一半的数。于是直接返回即可:
参考代码:
class Solution
public:
int majorityElement(vector<int>& nums)
sort(nums.begin(),nums.end());//排序
return nums[nums.size() / 2];
;
以上是关于剑指offer39-数组中出现次数超过一半的数字的主要内容,如果未能解决你的问题,请参考以下文章
剑指 Offer 39. 数组中出现次数超过一半的数字 的 详细题解