《牛客》数组中出现次数超过一半的数字

牛客的刷题之路不停歇 ⌓‿⌓

不积跬步无以至千里,不积小流无以成江海

The harder you work,the luckier you will be


题目及示例

题目链接

描述

给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

例如输入一个长度为9的数组1,2,3,2,2,2,5,4,2。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

数据范围:n≤50000n≤50000,数组中元素的值 0≤val≤100000≤val≤10000

要求:空间复杂度:O(1)O(1),时间复杂度 O(n)O(n)

输入描述

保证数组输入非空,且保证有解

样例


题目解读

查找数组中元素数量超过整个数组元素数量一半的元素

可通过记录每个元素出现的次数来实现相应问题的查找


方法一(取巧的解决方法):

思路:

已知,数组非空,且一定有解,那就一定有一个元素的数量超过一半,我们只需要通过对数组进行排序,然后取中间值即可

思路说明:

如数组 { 1,5,7,2,2,2,2,2}排序后为{1,2,2,2,2,2,5,7}

再如数组{1,3,5,5,5,5,4}排序后为{1,3,4,5,5,5,5}

因为该元素的数量超过整个数组数量的一半,所以其不管大小,排序后必定经过数组中心

核心代码:

复制代码
int MoreThanHalfNum_Solution(vector<int>& numbers) {
        sort(numbers.begin(),numbers.end());
        return numbers[numbers.size()/2];
    }

方法二(哈希表):

思路:

通过哈希表记录每个元素的出现个数,当达到目标时返回答案即可

  • 先构建一个map容器用于哈希表
  • 通过 for 循环对每个元素进行试探
  • 通过对map容器的应用进行对其进行++操作
  • 当容器中有元素的数量到达目标时,直接返回答案

核心代码:

复制代码
int MoreThanHalfNum_Solution(vector<int>& numbers) {
        unordered_map<int,int> hx;
        for(int i=0;i<numbers.size();i++)
        {
            hx[numbers[i]]++;
            if(hx[numbers[i]] > numbers.size()/2)
            {                               
                return numbers[i];
            }                         
        }                                                                         
        return 0;
    }

希望能给你提供一下参考思路

✿✿ヽ(°▽°)ノ✿

相关推荐
团象科技10 分钟前
走访近百支出海技术团队后的海外云计算资源选型实操观察
大数据·人工智能·算法
勤自省27 分钟前
吴恩达机器学习课程实验:线性回归模型入门(课后实验)
人工智能·算法·机器学习·回归·线性回归
ChillCoding32 分钟前
更新中:C++ STL库,查找排序(基础算法),数据结构,数学算法,竞赛相关基础
数据结构·c++·算法
智者知已应修善业37 分钟前
【51单片机使用IO组赋值方法实现无源蜂鸣器响时LED12亮不响时34亮】2024-3-7
c++·经验分享·笔记·算法·51单片机
珊瑚里的鱼1 小时前
【动态规划】按摩师
算法·动态规划
Fms_Sa1 小时前
贪心算法-背包问题
算法·贪心算法·c#
大雨淅淅1 小时前
【机器人】ROS2 机械臂控制(MoveIt2)从入门到实战
人工智能·python·神经网络·学习·算法·机器学习·机器人
智者知已应修善业1 小时前
【51单片机0.1秒计时到21.0时点亮LED】2024-1-5
c++·经验分享·笔记·算法·51单片机
apcipot_rain1 小时前
计科八股20260606——二叉树、PCA、图深度学习、进程上下文、C语言预编译、文件读写、单精度浮点数
c语言·数据结构·算法·pca·图神经网络
scx_link1 小时前
逻辑回归的总结
算法·机器学习·逻辑回归