欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 牛客网NC22222:超半的数

牛客网NC22222:超半的数

2025/11/8 4:28:08 来源:https://blog.csdn.net/2301_80944977/article/details/148014158  浏览:    关键词:牛客网NC22222:超半的数

牛客网NC22222:超半的数

题目描述

在这里插入图片描述

输入输出格式

输入格式:

  • 第一行包含一个整数 n (1 ≤ n ≤ 1000)
  • 第二行包含 n 个整数 a_i (1 ≤ a_i ≤ 10^9)

输出格式:

  • 输出一个整数,表示出现次数超过一半的那个数

解题思路

这道题目有多种解法,本文实现的是最直观的暴力解法。我们对数组中的每个元素,统计它在数组中出现的次数,如果发现某个元素出现次数超过 n/2,则输出该元素并结束程序。

算法流程

  1. 读取数组大小 n 和数组元素
  2. 对于数组中的每个元素 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

执行过程:

  1. 读取 n=5,数组为 [1,2,2,3,2]
  2. 对于 a[1]=1,统计出现次数为 1,不超过 5/2=2
  3. 对于 a[2]=2,统计出现次数为 3,超过 5/2=2
  4. 输出 2 并结束程序

优化思路

虽然本题的暴力解法已经能够解决问题,但当数据规模增大时,可能会超时。以下是一些可能的优化方向:

  1. 哈希表计数:使用哈希表统计每个元素出现的次数,将时间复杂度降至 O(n)
  2. 摩尔投票算法:专门用于找出出现次数超过一半的元素,时间复杂度为 O(n),空间复杂度为 O(1)

注:根据题目要求,本文仅对原有解法进行分析和讲解,未对算法本身进行优化。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词