(15)数组中出现次数超过一半的数字
2013-11-22 20:21
417 查看
题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如数组data{1,2,3,2 ,2 , 2 ,5 , 4 , 2};数组长度为9,其中2出现5次,超过数组长度的一半,因此输出为2;
思路一:
若数组是无序的,我们可以利用排序算法将数组排序,那么有根据数组的特点,在下标[N / 2]处即为所求;
{1 ,2 ,2 ,2 ,2 ,2 ,3 ,4 ,5}--->data[9 / 2] = {2};
利用快速算法排序时间复杂度O(nlog(2)n),对数组[N / 2]直接索引O(1);总的时间复杂度为O(nlog(2)n);
思路二:
仔细考虑问题,查找出现次数“超过一半”的元素,那么该元素出现的次数总和为“大于”其他元素的次数总和;
那么我们在一次遍历数组时,需要保存两个值:
currentData:保存数组中的数字;
dTimes:相同数字的次数;
遍历数组:
若currentData与下一个数字不同:dTimes--
若currentData与下一个数字相同:dTimes++
若dTime == 0:currentData = data[i](下一个数字) , dTimes = 1;
时间复杂度为O(n);
代码实现:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如数组data{1,2,3,2 ,2 , 2 ,5 , 4 , 2};数组长度为9,其中2出现5次,超过数组长度的一半,因此输出为2;
思路一:
若数组是无序的,我们可以利用排序算法将数组排序,那么有根据数组的特点,在下标[N / 2]处即为所求;
{1 ,2 ,2 ,2 ,2 ,2 ,3 ,4 ,5}--->data[9 / 2] = {2};
利用快速算法排序时间复杂度O(nlog(2)n),对数组[N / 2]直接索引O(1);总的时间复杂度为O(nlog(2)n);
思路二:
仔细考虑问题,查找出现次数“超过一半”的元素,那么该元素出现的次数总和为“大于”其他元素的次数总和;
那么我们在一次遍历数组时,需要保存两个值:
currentData:保存数组中的数字;
dTimes:相同数字的次数;
遍历数组:
若currentData与下一个数字不同:dTimes--
若currentData与下一个数字相同:dTimes++
若dTime == 0:currentData = data[i](下一个数字) , dTimes = 1;
时间复杂度为O(n);
代码实现:
#include<iostream> using namespace std; //---------------------------------------------------------------数组中出现次数超过一半的数字------------------------------------------------ //输入数组是否有效 bool p_dInvalidInput = false; bool p_InvalidInput(int* data , int length) { p_dInvalidInput = false; if(data == NULL && length <= 0) p_dInvalidInput = true; return p_dInvalidInput; } //检测是否数组中含有次数超过数组长度一半的数字 bool p_IsMoreThanHalf(int* data , int length , int number) { int n_times = 0; for(int i = 0; i < length; ++i) { if(data[i] == number) n_times++; } bool p_dIsMoreThanHalf = true; if(n_times * 2 <= length) { p_dInvalidInput = true; p_dIsMoreThanHalf = false; } return p_dIsMoreThanHalf; } //查找次数超过数组长度一半的数字 int FindNumber(int* data , int length) { if(p_InvalidInput(data , length)) return 0; int targetNumber; int nTimes; for(int i = nTimes = 0; i < length; ++i) { if(nTimes == 0) { targetNumber = data[i]; nTimes = 1; } else { if(targetNumber == data[i]) nTimes++; else nTimes--; } } if(!p_IsMoreThanHalf(data , length , targetNumber)) targetNumber = 0; return targetNumber; }
相关文章推荐
- 【第六课:C++和opencv】图像的膨胀
- Python清屏方法
- 买房注意点
- ??????
- 北京优视
- java字符集编码研究
- asp.net 4.0+jquery easyui 导出excel
- 上海买房地点选择
- uri转成绝对路径
- 用PYTHON输入输出字符串
- 时间子系统5_低分辨率切换高分辨率
- hdu 1565 方格取数(1) (最小割/状态压缩+DP)
- Git分布式开发之生成ssh公钥
- Mybatis环境的xml配置文件的注意事项
- 浙工ACM1887
- Maximum Submatrix
- Android之实现百度云主界面框架
- PHP htmlspecialchars() 函数
- TortoiseGit日常使用指南
- How To Add The BackTrack Repository To Ubuntu 12.10/12.04/11.10