找出整型数组中占比超过一半的数| 豆包MarsCode AI刷题

47 阅读3分钟

问题描述

小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。

测试样例

样例1:

输入:array = [1, 3, 8, 2, 3, 1, 3, 3, 3]
输出:3

解题思路

根据问题,我们可以采用摩尔投票算法来解决。其核心思路是通过抵消不同的元素,因为已知存在一个数字出现次数超过数组元素总数的一半,所以在不断抵消的过程中,最后剩下的那个元素大概率就是我们要找的数字。然后再通过一次遍历验证这个候选数字是否真的出现次数超过一半,以此来确保结果的准确性。

因而本题我们可以通过两个大步骤解决:

1.利用摩尔投票算法找出候选数字

初始化一个候选数字 candidate(初始值设为 0,这个初始值在后续的遍历中会被更新)和一个计数变量 count(初始值设为 0)。

开始遍历给定的整数数组 array,对于数组中的每个数字 num

当 count 的值为 0 时,将当前数字 num 设为 candidate,意味着此时开始把这个数字当作可能的多数元素(出现次数超过一半的元素)的候选。

如果当前数字 num 和 candidate 相等,说明遇到了相同的元素,将 count 的值加 1,表示这个候选元素的 “票数” 增加了。

若当前数字 num 和 candidate 不相等,就将 count 的值减 1,相当于不同元素之间相互抵消了一票。

经过遍历后,剩下的 candidate 就是在抵消过程中留存下来的那个可能的多数元素。

2.验证候选数字是否符合要求

重新初始化 count 为 0,再次遍历数组 array

对于数组中的每个数字 num,当它和之前得到的 candidate 相等时,就将 count 的值加 1,也就是统计这个候选数字在整个数组中实际出现的次数。

最后判断 count 的值是否大于数组长度的一半,如果是,那么 candidate 就是我们要找的那个出现次数超过一半的数字。如果不是,则说明不存在这样符合条件的数字,抛出异常表示没有找到多数元素。

主要代码为:

1732722165579.png

通过运用摩尔投票算法结合后续的验证步骤,代码中的 solution 函数能够有效地在给定的整数数组中查找出那个出现次数超过数组元素总数一半的数字。先利用摩尔投票算法的抵消机制找出候选数字,再通过二次遍历验证其是否真正满足出现次数超过一半的条件,有效避免对数组进行复杂的排序或者多次统计每个数字出现次数等操作,适用于解决此类寻找多数元素的问题。