数组中出现次数超过一半的数字

来源:互联网 发布:数据挖掘原理与实践 编辑:程序博客网 时间:2024/06/01 08:19

出现的次数超过数组长度的一半,表明这个数字出现的次数比其他数字出现的次数的总和还多。所以我们可以考虑每次删除两个不同的数,那么在剩下的数中,出现的次数仍然超过总数的一半。通过不断重复这个过程,不断排除掉其它的数,最终找到那个出现次数超过一半的数字。

例:数组 a[5]={0,1,2,1,1};

我们要查找的数字为1,操作步骤为:遍历整个数组,然后每次删除不同的两个数字,过程如下:

 0 1 2 1 1 =>2 1 1=>1

#include <iostream>using namespace std;int findCandi(int* a, int len){int i, candidate;int nTimes = 0;for (i = 0; i < len; i++){if (nTimes == 0){candidate = a[i];nTimes++;}if (candidate == a[i]){nTimes++;}else{nTimes--;}}return candidate;}int main(){int a[10] = {1, 2, 3, 1, 1, 4, 5, 1, 1, 7};int N = 10;cout<<findCandi(a, N);}