算法 n大小的数组中找出出现3/n次数以上的元素

本文介绍了一种在数组中寻找出现次数超过总数三分之一的众数的算法。通过使用两个变量来存储可能的众数,并利用计数器进行跟踪,该算法能够在一次遍历内找出所有符合条件的众数。

首先要知道n长度中出现次数超过3/n的元素不会超过两个,所以设置两个存储结果的变量,再对这两个指针分别设置两个int变量

然后往数组后面依次走,如果有一样的则在那个元素的int变量+1,如果都不存在则两个int变量都-1,当哪个int变量为0时,则将数组当前元素放入变量中

循环到最后剩余的就是两个结果

数组找出出现次数超过 `n/2` 的元素,通常被称为“多数元素”问题。解决该问题的常用方法是 **摩尔投票算法(Moore Voting Algorithm)**,其核心思想是通过元素之间的相互抵消来找出出现次数最多的元素。由于多数元素的出现次数超过一半,因此最终未被抵消的元素即为所求。 ### 摩尔投票算法实现 摩尔投票算法的时间复杂度为 `O(n)`,空间复杂度为 `O(1)`,非常适合解决此类问题。算法维护两个变量:一个候选元素 `maj` 和一个计数器 `count`。遍历数组时,如果当前元素与候选元素相同,则计数器加一;否则,计数器减一。当计数器为零时,更新候选元素并重置计数器。 以下是该算法的实现代码: ```cpp int majorityElement(vector<int>& nums) { int maj = nums[0], count = 0; for (int i = 0; i < nums.size(); i++) { if (nums[i] == maj) count++; else count--; if (count == 0) { maj = nums[i]; count = 1; } } return maj; } ``` ### 其他方法 除了摩尔投票算法,还可以采用以下方法解决该问题: #### 1. **暴力法** 遍历数组,统计每个元素的出现次数判断是否超过 `n/2`。该方法的时间复杂度为 `O(n^2)`,空间复杂度为 `O(1)`,效率较低。 #### 2. **排序法** 对数组进行排序后,多数元素一定位于数组的中间位置。该方法的时间复杂度为 `O(n log n)`,空间复杂度为 `O(1)`(若使用原地排序)。 ```cpp int majorityElement(int* arr, int len) { sort(arr, arr + len); return arr[len / 2]; } ``` #### 3. **哈希表法** 使用哈希表统计每个元素的出现次数,最终找出出现次数超过 `n/2` 的元素。时间复杂度为 `O(n)`,空间复杂度为 `O(n)`。 ```cpp int majorityElement(int* arr, int len) { unordered_map<int, int> count; for (int i = 0; i < len; i++) { count[arr[i]]++; if (count[arr[i]] > len / 2) return arr[i]; } return -1; } ``` ### 总结 摩尔投票算法是解决此类问题的最优选择,因其时间与空间效率均衡,适用于大规模数据处理。其他方法如暴力法、排序法和哈希表法也可用于特定场景,但通常不如摩尔投票算法高效。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值