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

来源:互联网 发布:五年目的放课后淘宝 编辑:程序博客网 时间:2024/05/18 07:28

/*数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,输出2.*/#include "iostream"#include "map"using namespace std;void MoreThanHalfNum0(int* numbers, int len){if (numbers == NULL || len <= 0)return;map<int, int> count;for (int i = 0; i < len; i++)count[numbers[i]]++;int maxCount = 0;int value;for (map<int, int>::iterator iter = count.begin(); iter != count.end(); iter++){if (iter->second > maxCount){maxCount = iter->second;value = iter->first;}}if (maxCount * 2 > len)cout << value;elsecout << "No number appearing more than half the length of the array." << endl;}//方法二:基于partition算法,找中位数。//算法前提:如果存在,排序后一定是中位数。先基于快排的思想找出中位数,//再验证该数字出现次数是否大于长度一半。(实现略)bool checkMoreThanHalf(int* numbers, int len, int value){int times = 0;for (int i = 0; i < len; i++)if (numbers[i] == value)times++;if (times * 2 >= len)return true;elsereturn false;}//方法三:该数字出现次数比其他数字出现次数和还要多。void MoreThanHalfNum2(int* numbers, int len){if (numbers == NULL || len <= 0)return;int num = numbers[0];int numCount = 1;for (int i = 1; i < len; i++){if (numCount == 0){numCount = 1;num = numbers[i];}else if (numbers[i] == num)numCount++;else{numCount--;}}if (!checkMoreThanHalf(numbers, len, num))cout << "No number appearing more than half the length of the array." << endl;elsecout << num << endl;}void test(){int a[] = { 1, 2, 3, 2, 2, 2, 5, 4, 2 };MoreThanHalfNum0(a, sizeof(a) / sizeof(int));}int main(){test();return 0;}



0 0
原创粉丝点击