数组中出现次数超过一半的数字(C/C++)

176 篇文章 ¥59.90 ¥99.00
本文介绍了摩尔投票算法,用于在C/C++数组中寻找出现次数超过一半的数字。通过两两抵消不同数字,最终留下的可能是目标数字。提供了C/C++代码实现,时间复杂度为O(n)。

数组中出现次数超过一半的数字(C/C++)

在解决算法问题时,经常会遇到需要找到一个数组中出现次数超过一半的数字的情况。本文将介绍一种高效的解决方法,并提供相应的C/C++源代码。

算法思路:
为了找到数组中出现次数超过一半的数字,我们可以利用摩尔投票算法(Moore Voting Algorithm)。该算法的基本思想是,通过两两抵消不同的数字,最终剩下的数字就有可能是出现次数超过一半的数字。

具体步骤如下:

  1. 初始化候选数字candidate和对应的计数count为0。
  2. 遍历数组中的每个元素:
    • 如果count为0,将当前元素设置为候选数字candidate。
    • 如果当前元素与候选数字candidate相同,增加计数count。
    • 如果当前元素与候选数字candidate不同,减少计数count。
  3. 最终剩下的候选数字candidate就是出现次数超过一半的数字。

C/C++源代码实现如下:

#include <iostream>
在C语言中,要找出一个长度为`n`的数组中出现次数超过一半数字,可以使用哈希表(如`unordered_map`在C++中,但在C语言里我们可以手动实现类似的功能)或者使用线性扫描结合计数的方法。这里我们使用后者,即遍历数组并同时更新每个元素出现的次数,然后再次遍历数组查找第一个达到或超过数组长度一半次数的元素。 ```c #include <stdio.h> int majorityElement(int arr[], int n) { if (n == 0) return -1; // 防止空数组 int candidate = arr[0], count = 1; for (int i = 1; i < n; i++) { if (arr[i] == candidate) count++; else count--; if (count == 0) { // 更新候选元素 candidate = arr[i]; count = 1; } } // 再次检查最后的候选元素是否超过一半 count = 0; for (int i = 0; i < n; i++) count += (arr[i] == candidate); return (count > n / 2) ? candidate : -1; } int main() { int arr[] = {2, 2, 1, 3, 2, 2}; int n = sizeof(arr) / sizeof(arr[0]); int result = majorityElement(arr, n); if (result != -1) printf("Majority element is %d\n", result); else printf("No majority element found.\n"); return 0; } ``` 在这个例子中,`majorityElement`函数首先假设第一个元素作为候选数,并计算它的计数。然后它遍历整个数组,如果遇到相同的元素,计数加一;否则,减一。如果计数变为零,则更换当前候选数。最后再检查候选数在整个数组中的实际出现次数,如果大于一半则返回,否则返回-1表示没有找到满足条件的元素。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值