找出数组出现次数超过一半的数
来源:互联网 发布:2017网络神曲 编辑:程序博客网 时间:2024/05/19 13:24
例如:
数组{1,2,3,4,1,1,2,1,1}中1出现了5次超过长度9的一半。因此输出1;
注:这里没有考虑出现次数最多的数字是0的情况,关键在于方法
这里给出两种常用方法:
解法一:基于排序(快排)的算法
这种算法优点在于理解起来比较容易,如果一个数出现次数超过长度的一半,那将数组排序之后位于数组中间位置的数一定就是要找到的数。
注:需要检测一下中间的数是否是超过一半的数,因为有可能出现次数最多的也不到一半,根据题目要求自己选择是否需要
下面是代码实现:
#include<iostream>using namespace std;bool CheckInvalidArray(int* numers, int length);int Partition(int* numbers, int length, int start, int end); //快速排序int MoreThanHalfNum(int* numbers, int length);int RandomInRange(int min, int max){ int random = rand() % (max - min + 1) + min; return random;}void Swap(int* num1, int* num2){ int temp = *num1; *num1 = *num2; *num2 = temp;}bool CheckInvalidArray(int* numers, int length){ if(numers == NULL || length <= 0) return true; return false;}bool CheckMoreThanHalf(int* numbers, int length, int result){ int times = 0; for(int i=0; i<length; i++) { if(numbers[i] == result) times++; } if (times*2 <= length) return false; return true;}int Partition(int* numbers, int length, int start, int end){ if (numbers == NULL || length <= 0 || start < 0 || end >= length) throw new exception("Invalid Parameters"); int index = RandomInRange(start, end); Swap(&numbers[index], &numbers[end]); int small = start - 1; for(index=start; index<end; ++index) { if (numbers[index] < numbers[end]) { ++small; if (small != index) Swap(&numbers[small], &numbers[index]); } } ++small; swap(numbers[small], numbers[end]); return small;}int MoreThanHalfNum(int* numbers, int length){ if(CheckInvalidArray(numbers, length)) return 0; int middle = length >> 1; int start = 0; int end = length - 1; int index = Partition(numbers, length, start, end); while (middle != index) { if (middle < index) end = index - 1; else start = index + 1; index = Partition(numbers, length, start, end); } int result = numbers[middle]; if (!CheckMoreThanHalf(numbers, length, result)) result = 0; return result;}
解法二:根据数组特点寻找
优点:方法简单,实现也很简单
int MoreThanHalfNum2(int* numbers, int length){ if(CheckInvalidArray(numbers, length)) //参数不合法 return 0; int result = numbers[0]; int times = 1; for (int i=0; i<length; i++) { if (times == 0) { result = numbers[i]; times = 1; } else if(numbers[i] == result) times++; else times--; } if(!CheckMoreThanHalf(numbers, length,result)) result = 0; return result;}
阅读全文
0 0
- 找出数组中出现次数超过一半的数
- 算法--找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 算法--找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 算法--找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出出现次数超过数组一半元素的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组出现次数超过一半的数
- 数组出现次数超过一半的数
- 找出一组数出现次数超过一半的数
- 找出数组中出现次数超过数组长度一半的数
- GDUT-1164-找出出现次数超过一半的数
- 获取HiveConnection,及重现获取过程中的某些问题。
- ios tableView加载cell时有延时的操作 比如反地理编码
- Code obfuscation
- Const类
- RecyclerView的滑动到指定位置
- 找出数组出现次数超过一半的数
- Android开发——贝塞尔曲线解析
- Android应用防止模拟点击,防范抢红包类似插件的方法
- 智能家居2.0:智能音箱何以成为新的入口
- mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- Android进阶之路
- vi命令大全
- 算法:两种算法相比较(选择和插入排序)
- HDU 6034 Balala Power!【贪心】