找出数字比例超过n/2的【简单】
问题描述 给定一个长度为n的整型数组,已知其中一个数字的出现次数超过数组长度的一半,找出这个元素
输入格式 一个长度为n的数组,其中某个元素的出现次数大于n/2 输出格式 一个整数
输入样例 [1,3,8,2,3,1,3,3,3] 输出样例 3
数据范围 任意长度为n整数数组,其中某个元素的出现次数大于n/2
1.算法思路
- 方法一:使用哈希表存储每种数字出现的次数,如果某个数字出现的次数超过了总数组的一半,那么返回。
- 方法二:给数组进行排序,返回中间的那个值
方法一的图解:
方法二的图解:
介绍一下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).