牛客网NC22222:超半的数
牛客网NC22222:超半的数
题目描述
输入输出格式
输入格式:
- 第一行包含一个整数 n (1 ≤ n ≤ 1000)
- 第二行包含 n 个整数 a_i (1 ≤ a_i ≤ 10^9)
输出格式:
- 输出一个整数,表示出现次数超过一半的那个数
解题思路
这道题目有多种解法,本文实现的是最直观的暴力解法。我们对数组中的每个元素,统计它在数组中出现的次数,如果发现某个元素出现次数超过 n/2,则输出该元素并结束程序。
算法流程
- 读取数组大小 n 和数组元素
- 对于数组中的每个元素 a[i]:
- 统计 a[i] 在整个数组中出现的次数
- 如果出现次数大于 n/2,则输出 a[i] 并结束程序
复杂度分析
- 时间复杂度:O(n²),其中 n 是数组大小。我们需要遍历数组中的每个元素,然后对每个元素再次遍历数组统计频次。
- 空间复杂度:O(n),用于存储输入数组。
代码实现
#include<bits/stdc++.h>
using namespace std;int main(){int n;cin>>n;int a[n];// 读取数组元素for(int i=1;i<=n;i++){cin>>a[i];}// 寻找出现次数超过一半的元素for(int i=1;i<=n;i++){int s=0;//每次外层循环遍历新元素 a[i] 时,会重新声明并初始化 s=0,确保统计该元素的出现次数时计数器 s 是从零开始累加的for(int j=1;j<=n;j++){if(a[i]==a[j])s++;}if(s>n/2){cout<<a[i];break;}}return 0;
}
示例解析
以示例 1 为例:
输入:
5
1 2 2 3 2输出:
2
执行过程:
- 读取 n=5,数组为 [1,2,2,3,2]
- 对于 a[1]=1,统计出现次数为 1,不超过 5/2=2
- 对于 a[2]=2,统计出现次数为 3,超过 5/2=2
- 输出 2 并结束程序
优化思路
虽然本题的暴力解法已经能够解决问题,但当数据规模增大时,可能会超时。以下是一些可能的优化方向:
- 哈希表计数:使用哈希表统计每个元素出现的次数,将时间复杂度降至 O(n)
- 摩尔投票算法:专门用于找出出现次数超过一半的元素,时间复杂度为 O(n),空间复杂度为 O(1)
注:根据题目要求,本文仅对原有解法进行分析和讲解,未对算法本身进行优化。