伴学笔记——题解:寻找整形数组占比超过一半的数

32 阅读2分钟

问题回顾

问题描述

小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;

}`