案例

数列3, 2, 3, 1, 3, 3, 2, 3中,3就是个数大于总数大于一半的元素。

思路一

对数列排序,再扫描一边,找出元素个数超过一半的元素。此时需要排序,同时需要记录每个元素出现个数,费时、费空间。

思路二

对于排好序的数列,假设总数为N,那么N/2位置的那个数必定为所求之数,这就不需要记录每个元素的个数。

思路三

对于数列,不用排序。对于其中的任意两个不同的元素,去除之后,原来那个个数大于总数一半的元素个数仍然是大于剩下元素的一半的。利用该特性遍历一遍数列就可以找出这个总数大于一半的那个元素。

具体的实施,不用每次去这些数中去找不同的两个数,只需记录当前候选目标值can,与此对应的为其个数num,目前访问的元素为cur

num==0: can=cur, num=1

num!=0 && can = cur: num++

num!=0 && can != cur: num--

如果现在访问的元素与目标值相同,那么num++,不同num--;如果num=0,那么把候选元素改为此元素,并且赋值num=1

图示

通过简单分析可以得知

当总素为偶数时,Num最终至少为2

当总数为奇数时,Num最终至少为1

参考代码

#include

using namespacestd;int Find(int a[], intN)

{int count = 0;int candidate = 0;for(int i = 0; i < N; ++i)

{if(count == 0)

{

candidate=a[i];

count= 1;

}else if(candidate ==a[i])++count;else

--count;

}returncandidate;

}intmain()

{int a[] = {3, 2, 3, 1, 3, 3, 2, 3};int val = Find(a, sizeof(a) / sizeof(int));

cout<< "Result:" << val <

}

结果

Result:3

性能

时间复杂度O(n), 空间复杂度O(1)

扩展

3个人发帖超过n/4,找粗这三个人

void Find(Type* ID, int N, Type candidate[3])

{

Type ID_NULL;//定义一个不存在的ID

int nTimes[3], i;

nTimes[0]=nTimes[1]=nTimes[2]=0;

candidate[0]=candidate[1]=candidate[2]=ID_NULL;for(i = 0; i < N; i++)

{if(ID[i]==candidate[0])

{

nTimes[0]++;

}else if(ID[i]==candidate[1])

{

nTimes[1]++;

}else if(ID[i]==candidate[2])

{

nTimes[2]++;

}else if(nTimes[0]==0)

{

nTimes[0]=1;

candidate[0]=ID[i];

}else if(nTimes[1]==0)

{

nTimes[1]=1;

candidate[1]=ID[i];

}else if(nTimes[2]==0)

{

nTimes[2]=1;

candidate[2]=ID[i];

}else{

nTimes[0]--;

nTimes[1]--;

nTimes[2]--;

}

}return;

}

python 历遍数列找出大于一个数的值_找出数列中个数大于总数一半的元素(编程之美2.3)...相关推荐

  1. python 历遍,Python 历遍目录

    使用 os 模块的 walk() 函数可以实现历遍目录的操作,该函数接收一个绝对路径字符串作为必选参数,返回三个参数: 当前目录--指程序当前工作目录--名称(字符串格式) 当前目录--指程序当前所历 ...

  2. python编程之美pdf_GitHub - Farolding/toPdf: 爬取“Python编程之美:最佳实践指南”制作PDF电子书...

    准备工作 爬取HTML页面转成PDF需要用到wkhtmltopdf工具,下载地址:https://wkhtmltopdf.org/downloads.html ,pdfkit是wkhtmltopdf的 ...

  3. python画树叶-用Python绘图,感受编程之美

    用Python绘图,感受编程之美冬日里,树叶都已落下,还好可以用Python,重现银杏树的美 用Python绘图,发现编程之美 冬日里,树叶都已落下,还好可以用Python,重现银杏树的美 昨日的雪, ...

  4. python 历遍子弹_python之子弹移动

    """ 新增功能: 完成我方坦克发射子弹的移动 """ import pygame import time import random wi ...

  5. python三个数输出最小值_从键盘输入三个数,输出其中的最大值和最小值。_学小易找答案...

    [单选题]关于 Python 程序格式框架的描述,以下选项中错误的是 ( ) [其它]实现multi()函数,参数个数不限,返回所有参数的乘积. [简答题]我和我的 [单选题]与x > y an ...

  6. c语言找出递增子数组的长度,编程之美2.16 数组中最长递增子序列的长度

    改进的方法看的头大了却还是不清楚,哎...搞算法的苦啊,纠结啊. 编程之美这本书里面就有关于这道题的一些解法,求一个一位数组中的最长序列的长度.例如,在序列1,3,2中,最长递增序列是1,3. 这道题 ...

  7. 编程之美2.9 斐波那契数列

    斐波那契数列是我们在学习C语言的时候,在递归那一章的经典实例,当然,还会有汉诺塔的例子. 这个问题时这样定义的: 0 (x <= 0) f(x)   =  1 (x == 1) f(x - 1) ...

  8. 编程之美2.8 找符合条件的整数

    这个题目是,给定一个整数 N,需要寻找另外一个整数 M,使得 N * M 得到的结果十进制表示中只存在1和0两个数字.首先看到这个题目,第一思想肯定是 使 M = 1,并依此递增 M 的值,直到 N ...

  9. python普通年金终值_下列投资决策评价指标中,考虑资金时间价值的有(

    [单选题]import pandas as pd 导入pandas库后,以下无法读取的数据类型是哪一个? [单选题]16-55. Windows中的剪贴板是一个特殊的存储区域,它位于 [单选题]imp ...

  10. Python计算分位点与逆运算:根据给定的值,计算在序列中的分位水平

    计算分位数 计算一个序列的分位点,使用: import numpy as npvalue_array = np.arange(0, 10, 1) print(np.quantile(value_arr ...

最新文章

  1. springboot集合jpa使用
  2. java 注解 enum_13 Java枚举和注解
  3. Java中的可变参数
  4. kinect2的标定
  5. 老兵传奇:聊聊我在华为的20年
  6. 基于Flink的超大规模在线实时反欺诈系统的建设与实践
  7. 风控策略和模型的区别_风控策略概述
  8. mask rcnn数据转换为tfrecord数据
  9. win7 Ftp搭建
  10. NOIP提高组【JZOJ4809】挖金矿
  11. 全景图航拍的方法,制作航拍全景图的步骤
  12. 文案自动修改软件-文案自动改写的免费软件下载
  13. 逆置单链表——递归与非递归
  14. ORB、SURF、SIFT特征点提取方法和ICP匹配方法
  15. 085 《穷查理宝典》简记
  16. 让数据填报、收集效率提升80%!这个报表工具真的太强大了
  17. Kali Linux渗透测试——WEB渗透(一)
  18. 左耳听风——笔记三:面试技巧
  19. 海思3531添加移远EC20 4G模块
  20. Visual Studio(VS) 编程推荐字体和主题设置

热门文章

  1. 肝毒净-道格拉斯实验室
  2. 软件测试的知识点总结
  3. tcpdf中增加微软雅黑的正确方式
  4. 迭代器 生成器 列表推导式 生成器表达式的一些总结
  5. Web开发者的六个代码调试平台
  6. iOS之正则表达式的使用
  7. 《构建之法》 第5.5 第6 第7章
  8. Windows7 64位下SDK Manager.exe无法运行问题解决方法
  9. Oracle 数字与空值的排序问题
  10. 2008中国最佳寓言