第一章习题【第 14 题】
有一个含 n( n>2)个整数的数组 a,判断其中是否存在出现次数超过所有元素一半的元素。
1.直观想法:
遍历一遍数组,把每个数的值记录到标记数组book[]中,当出现有book[a[i]]>n/2时则输出”yes”,遍历一遍结束未找到有元素大于n/2,则输出“no”.
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int book[maxn];
int main()
{
int n=maxn,i;
for(i=0;i<n;i++)
{
book[a[i]]++;
if(book[a[i]]>n/2)
{
cout<<"yes"<<endl;
break;
}
}
if(i==n) cout<<"no"<<endl;
return 0;
}
//思路好理解,时间复杂度不高,但太费空间
2.参考答案
#include <bits/stdc++.h>
using namespace std;
bool solve(int a[], int n, int &x)
{
sort(a, a + n); //递增排序
int maxnum = 0; //出现次数最多的次数
int num = 1;
int e = a[0];
for (int i = 1; i < n; i++)
{
if (a[i] == e)
{
num++;
if (num > maxnum)
{
maxnum = num;
x = e;
}
}
else
{
e = a[i];
num = 1;
}
}
if (maxnum > n / 2)
return true;
else
return false;
}
void main()
{
int a[] = {2, 2, 2, 4, 5, 6, 2};
int n = sizeof(a) / sizeof(a[0]);
int x;
if (solve(a, n, x))
printf("出现次数超过所有元素一半的元素为%d\n", x);
else
printf("不存在出现次数超过所有元素一半的元素\n");
}
吐槽:Dev_cpp 的一键调整代码格式功能突然不能用了,关于怎么就不能用了,着实让人疑惑。