博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【编程题目】数组中超过出现次数超过一半的数字 ☆
阅读量:4648 次
发布时间:2019-06-09

本文共 1293 字,大约阅读时间需要 4 分钟。

74.数组中超过出现次数超过一半的数字(数组)

题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。

 

思路:分治算法 两两一对 相同留下一个 不同扔掉 多出来的数字单独对比

/*74.数组中超过出现次数超过一半的数字(数组)题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。*///思路:分治算法 两两一对 相同留下一个 不同扔掉 多出来的数字单独对比#include 
#include
int find(int * in, int len){ if(len == 0) { return 0; } if(len % 2 == 1) //奇数,加一轮全部比较 { int i = 0; int count = 0; for(i = 0; i < len; i++) { if(in[i] == in[len - 1]) count++; } if(count > (len-1)/2) { return in[len - 1]; } } int * remain = (int *)malloc(len / 2 * sizeof(int)); //无法释放了..?? int remainlen = 0; for(int i = 0; i < len; i+=2) { if(in[i] == in[i+1]) { remain[remainlen++] = in[i]; } } return find(remain, remainlen); }int main(){ int a[10] = {
5,6,7,8,5,5,5,5,5,6}; int ans = find(a, 10); return 0;}

 

我的代码有个大问题,自己开辟的内存无法释放。在网上看答案,发现其实不用写得这么麻烦的...

网上的思路:http://www.oschina.net/code/snippet_859732_22139

 每次取出两个不同的数,剩下的数字中重复出现的数字肯定比其他数字多,将规模缩小。如果每次删除两个不同的数,那么剩下的数字里最高频数出现的频率一样超过一半,不断重复这个过程,最后剩下的将全是同样的数字。时间复杂度是O(n)

int findmostappear(int *a,int len) {       int candidate=0,count=0;       for(int i=0;i

 

转载于:https://www.cnblogs.com/dplearning/p/3899106.html

你可能感兴趣的文章
SCOPE_IDENTITY和@@identity的区别
查看>>
Navicat连不上Ubuntu?
查看>>
/*携程面试*/四个数组,都已经排好序,找出四个数组的交集
查看>>
数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)...
查看>>
查找searching
查看>>
【Linux开发】linux设备驱动归纳总结(四):2.进程调度的相关概念
查看>>
矩阵快速幂 斐波那契数列
查看>>
java重写equals和hashCode方法
查看>>
索引的概述与创建
查看>>
矩阵相乘
查看>>
分页查询的SQL语句
查看>>
Sublime Text 3 注册码
查看>>
jsp内置对象浅谈
查看>>
CentOS搭建SVN服务器
查看>>
WMS与MES集成
查看>>
设置SQLServer数据库内存
查看>>
Java随机3-斐波拉切函数
查看>>
Linux下undefined reference to ‘pthread_create’问题解决 zz
查看>>
P1638 逛画展(直尺法)
查看>>
常用正则表达式
查看>>