找出数组中出现次数超过一半的数字
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找出数组中出现次数超过一半的数字相关的知识,希望对你有一定的参考价值。
参考技术A#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
int n,i,j,x,xn=0,t,a[100];
srand(time(0));
scanf("%d",&n);
for(i=0; i<n; i++)
a[i]=rand()%3;
printf("%d ",a[i]);
printf("\\n");
for(i=0; i<=n/2; i++)
t=1;
if(a[i]>-1)
for(j=i+1; j<n; j++)
if(a[j]==a[i])
t++;
a[j]=-1;
if(t>=xn)
x=a[i];
xn=t;
if(xn>=n/2)
printf("%d出现了%d次\\n",x,xn);
else
printf("没有出现次数超过一半的数字\\n");
return 0;
剑指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];
}
};
以上是关于找出数组中出现次数超过一半的数字的主要内容,如果未能解决你的问题,请参考以下文章