算法--找出数组中出现次数超过一半的数
     每当我看到经典的算法题,就怀念高中,感觉很多算法题就是高中的题目,谁叫哥只读了个专科,高数基本相当没学。
     有空要看看高数啊,想当年数学那是相当的......

#include <iostream>
using namespace std;
class FindTheOne
{
public:
  方法一
  第一个想到的方法是见一个二维数组,一维存数组中的数据,二维存这个数出现的次数。出现次数最多的那个数就是要找的那个数
  由于某个数出现的次数超过数组长度的一半,所以二维数组的长度只需要这个数组的一半。代码实现如下,
  当然这个方法很糟糕,时间复杂度和空间复杂度都比较大,想练手的我还是写了一下。

  

void Search(int A[],int len,int& theOne)
{
if(NULL==A || len<=0)
{
return ;
}

int (*B)[2]=newint[len/2][2];
B[0][0]=A[0];
B[0][1]=1;

int t=0;
bool notExist=true;
for(int i=1;i<len;++i)
{
for(int j=0;j<t;++j)
{
if(A[i]==B[j][0])
{
B[j][1]++;
notExist=false;
break;
}
}
if(notExist)
{
B[t++][0]=A[i];
}
}

int max=1;
int k=0;
for(int i=0;i<len/2;++i)
{
if(B[i][1]>max)
{
max=B[i][1];
k=i;
}
}

theOne=B[k][0];
}

方法二
     将数组排序,最中间的那个数就是您要找的数。
     如果出现最多的那个数是最小的,那么1至(n+1)/2都是那个数
     如果出现最多的那个数是最大的,那么(n-1)/2至n都是那个数
     如果不是最小也不是最大,当这个数由最小慢慢变成最大的最大的数时,你会发现中间的那个数的值是不变的。
     综上所述,中间的那个数就是你要找的那个数。
     时间复杂度就是你排序用的时间。排序真的不想写了(可以参考《我的另一篇博客》)。大家都知道排序还是相当费时的,当然这个方法还是不太好。

方法三
     这个方法借用了别人的思路。
     在这里我做一下简单的分析。
     这个算法的时间复杂度是O(n),另外用了两个辅助变量。
     k用于临时存储数组中的数据,j用于存储某个数出现的次数。
     开始时k存储数组中的第一个数,j为0,如果数组出现的数于k相等,则j加1,否则就减1,如果j为0,就把当前数组中的数赋给k
     因为指定的数出现的次数大于数组长度的一半,所有j++与j--相抵消之后,最后j的值是大于等于1的,k中存的那个数就是出现最多的那个数。

下面这个算法只适合数组中数组中某个数的出现次数超过数组长度一半的数组,符合题意。

int Search(int A[],int len)
{
if(NULL==A || len<=0)
{
return-1;
}

int k, j=0;
for(int i=0;i<len;++i)
{
if(j==0)
{
k=A[i];
}
if(k==A[i])
{
++j;//有人说++j比j++有先天的优势,不知你是否听说,如果你也听说,有没有想过More Effective C++(C++程序员必看书籍)
}else
{
--j;
}
}

return k;
}

找出数组中出现次数超过一半的数相关推荐

  1. 《编程题》找出数组中出现次数超过一半的数(时间复杂度O(n),空间复杂度为O(1))

    解析:该题目可以用mapreduce的wordcount思想做,就是存储键.值对,键存数字,值存该数字出现的次数,当然需要用一个变量记住出现次数超过一半的数了,说完了,开始撸起袖子干了. public ...

  2. 用Python找出数组中出现次数超过一半的数

    数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 计数+比较 不考虑效率,采用最简单的办法,遍历数组,使用 List 的 count() 方法统计元素出现的次数: def more_th ...

  3. 快速找出数组中出现次数超过一半的数字

    "只要不是特别大的内存开销,时间复杂度比较重要.因为改进时间复杂度对算法的要求更高." --吴斌(NVidia,Graphics Architect) 同样是查找,如果是顺序查找需 ...

  4. java数组出现次数最多的数_找出数组中出现次数最多的那个数——主元素问题...

    方法一:以空间换时间,可以定义一个计数数组int count[101],用来对数组中数字出现的次数进行计数(只能针对数组中数字的范围1~100),count数组中最大的元素对应的下标,即为出现次数最多 ...

  5. 利用HashMap找出数组中出现次数最多的元素及其次数

    我在牛客网上刷题时遇到了这道题目,因为初学Java不久,对Java的应用还不熟悉,刚开始用C语言做没做出来(我太菜了...),接着百度发现竟然可以用HashMap做,仔细一想发现这真是一个好办法(为什 ...

  6. 28 数组中出现次数超过一半的数MoreThanHalfNum输入一个一维数组

    题目:数组中出现次数超过一半的数 要求:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超 ...

  7. 找出数组中第k大小的数,输出数所在的位置

    找出数组中第k大小的数,输出数所在的位置 /*写一段程序,找出数组中第k大小的数,输出数所在的位置.例如{2,4,3,4,7}中,第一大的数是7,位置在4. 第二大.第三大的数都是4,位置在1.3随便 ...

  8. 找出数组中第k大的数

    给定一个数组,找出数组中第k大的数.其实现代码如下: package com.threeTop.www;/*** 找出数组中第k大的数* @author wjgs**/ public class Fi ...

  9. Java找出数组中第K大的数

    题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5 ...

最新文章

  1. LeetCode简单题之Excel表列名称
  2. 美团安卓面试,难道Android真的凉了?快来收藏!
  3. C++知识整理(在此感谢大牛的整理)
  4. Ten graph questions of about 2000 difficulty of Codeforces Round 2
  5. 使用Echarts实现中国地图,官方china.js文件
  6. 三分钟学会数据库, INSERT INTO 插入
  7. shareSDK导入的常见错误及解决方法
  8. 秦汉考场科目三路线图_秦汉科目三考场考试攻略,附考场路线图
  9. 图解通信原理与案例分析-29:埃隆.马斯克的“星链”Starlink计划是卫星语音通信向卫星互联网的演进
  10. 手机应用软件卸载【adb】
  11. Android项目实战--手机卫士
  12. 误发邮件如何能撤回?
  13. 修改Pycharm背景色(黑)
  14. 跟我学c++中级篇——STL字符串之std::string_view
  15. 李洪超 硬件工程师_壹号本推出工程师PC运维迷你电脑,7寸大小,丰富的接口配置...
  16. lisp调用vlx模块_CAD二次开发,lisp程序生成应用程序VLX,如何在CAD里面创建一个快捷图标,点击快捷图标就可以调用程序?...
  17. 关于百度搜索技巧:都掌握了吗?
  18. thrift-transport
  19. imacros学习笔记
  20. 最新排名!伦敦、纽约、悉尼入选最适合营商的顶级投资居留城市前三;Canva可画完成2亿美元融资估值达400亿美元 | 美通社头条...

热门文章

  1. 微服务SpringCloud—Config Server对称加密
  2. MySQL 8.0新特性之原子DDL
  3. mysqlcppconn之ConnectOptionsMap的使用
  4. cocos2d-x游戏实例(5)-A星算法(1)
  5. vs2008【断点无效】解决方法
  6. 快快: 一点即玩的游戏客户端平台
  7. 你必须会的DFS的递归实现与堆栈实现
  8. (C/C++学习)6.数组指针和指针数组
  9. 阿里云服务器问题攻略
  10. 头脑风暴是如何毁掉创意的?