问题回顾
问题描述
小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。
测试样例
样例1:
输入:
array = [1, 3, 8, 2, 3, 1, 3, 3, 3]
输出:3
样例2:
输入:
array = [5, 5, 5, 1, 2, 5, 5]
输出:5
样例3:
输入:
array = [9, 9, 9, 9, 8, 9, 8, 8]
输出:9
题目思路:本题要记录一个数组中各个数出现的次数,我们考虑使用哈希表来实现,也可以开一个足够大的整数数组来实现,或者使用pair来实现。
什么是哈希表?#
哈希表(Hash Table),也叫散列表,是一种数据结构。它可以提供快速的插入、删除和查找操作。其基本原理是通过一个哈希函数(Hash Function)将键(Key)映射到一个固定大小的数组(称为哈希表)中的某个位置,这个位置就是存储该键值对(Key - Value Pair)的数据槽(Slot)。
哈希索引可以快速地定位到满足特定条件的记录。例如,在一个用户信息表中,如果要根据用户 ID 快速查找用户信息,就可以使用哈希表来构建索引。当查询一个用户 ID 时,通过哈希函数快速定位到存储该用户信息的位置,而不需要遍历整个表。
而在c++中,哈希表的创建是使用unordered_map<type1,type2>实现的,其中type1为键值的类型,type2为值的类型。在本题中,我们只需要让type1=type2=int即可。
而当某个数的哈希值大于等于arr.size()/2时,它就是我们要找的数据了。
为了计算方便,我们取b = arr.size()/2;
通过观察我们知道,一个数的哈希值是递增的。也就是说:它会从0开始递增到最大值max,所以,我们不需要去考虑一个数哈希值大于b的情况,因为它的递增路径必然经过b。这样子,我们可以优化我们的计算次数,让某个数的哈希值等于b时就返回,达到题目的要求。
` #include #include #include <unordered_map>
using namespace std;
int solution(vector array) { // Edit your code here std::unordered_map<int,int> a; int b = array.size()/2;if(b!=(double)array.size()/2){b++;} for(int i = 0;i!=array.size();i++) { a[array[i]]++;
if(a[array[i]] == b)
{
return array[i];
}
}
return 0;
}
int main() { // Add your test cases here
cout << (solution({4,19,19}) == 19) << endl;
return 0;
}`