刷题--找出数字比例超过n/2的 | 豆包MarsCode AI刷题

69 阅读3分钟

找出数字比例超过n/2的【简单】

问题描述 给定一个长度为n的整型数组,已知其中一个数字的出现次数超过数组长度的一半,找出这个元素

输入格式 一个长度为n的数组,其中某个元素的出现次数大于n/2 输出格式 一个整数

输入样例 [1,3,8,2,3,1,3,3,3] 输出样例 3

数据范围 任意长度为n整数数组,其中某个元素的出现次数大于n/2

1.算法思路

  • 方法一:使用哈希表存储每种数字出现的次数,如果某个数字出现的次数超过了总数组的一半,那么返回。
  • 方法二:给数组进行排序,返回中间的那个值

方法一的图解:

image.png

方法二的图解:

image.png

介绍一下C++的哈希表unordered_map:

std::unordered_map 是 C++ 中用于实现哈希表的高效容器,提供了插入、查找、修改、删除和遍历等基本操作。通过这些操作,可以方便地管理和操作键值对的数据结构

在本题当中,我们遍历一下原来的数组,记录下每种数字出现的次数。key是数组中出现了哪些数字,value是每种数字出现的次数。

具体代码:


#include <iostream>
#include <vector>
#include<unordered_map>

using namespace std;

int solution(vector<int> array) {
    unordered_map<int,int>m;
    for(auto i:array)
    {
        m[i]++;
    }
    for(auto kv:m)
    {
        if(kv.second>array.size()/2)
        {
            return kv.first;
        }
    }
    
}

int main() {
    // Add your test cases here
    
    cout << (solution({1, 3, 8, 2, 3, 1, 3, 3, 3}) ) << endl;
    
    return 0;
}

方法二:排序

通过C++库里面自带的库函数sort,可以对数组进行升序排序,由于有意个数字出现的次数超过一半,那么排完序后,那个数字一定出现在数组的中间位置。

sort的使用:

std::sort 是 C++ 标准库中的一个函数,用于对容器(如数组、向量等)进行排序。它位于 <algorithm> 头文件中,提供了一种高效的方式来对数据进行排序。std::sort 可以对任何支持随机访问的容器进行排序,默认情况下是按升序排序。

基本用法

std::sort 的基本语法如下:

template< class RandomIt > void sort( RandomIt first, RandomIt last );

其中,RandomIt 是一个迭代器类型,表示排序的范围是从 first 到 last(不包括 last)。

总结:std::sort 是 C++ 中非常强大的排序工具,可以对任何支持随机访问的容器进行排序。它支持自定义比较函数,能够满足各种排序需求。

代码:

#include <iostream>
#include <vector>
#include<unordered_map>
#include<algorithm>

using namespace std;

int solution(vector<int> array) {
    sort(array.begin(),array.end());
    return array[array.size()/2];
}

int main() {
    // Add your test cases here
    
    cout << (solution({1, 3, 8, 2, 3, 1, 3, 3, 3}) ) << endl;
    
    return 0;
}

总结:

本题可以使用哈希表或者排序解决,是一道简单题,使用哈希表的时间复杂度为O(n),空间复杂度为O(n),排序的时间复杂度是O(nlogn),空间复杂度O(1).