问题:设T[0:n-1]是n个元素的数组。对任一元素x, 设S(x)={ i | T[ i ] = x }。当|S(x)|>n/2时, 称x为主元素。 设计一个线性时间算法, 确定T[0:n-1]是否有一个主元素,如果有,则返回。


参考了一下网上的思路,大多是直接求主元素的问题。至于是否有主元素,我们假设存在,然后在求完后进行验证,如果不是,则答案值无效。

由主元素的定义可以推证如下定理:

定理1:如果x是数组a的主元素,那么x必也是数组a的中位数、众数

(x的个数已经超过数组a的一半)

定理2:如果存在主元素,那么主元素与非主元素的个数差count一定大于0

(设总体元素个数为 n,主元素个数为 k,则非主元素个数为 n-k。count = 2k - n > 0)

定理3:如果序列存在主元素,删除序列两个不同的元素,主元素不变。

(有两种情况:①删除的两个元素都不是主元素,那肯定影响主元素改变 ②删除的一个是主元素一个不是,count =2(k - 1) - (n -2) = 2k - n 不变)

定理4:序列至多存在一个主元素


方法一:直接排序找中位数 —— 时间复杂度 O(nlogn)

由定理1,可以直接快排找出中位数mid,然后检验mid是否为主元素。

时间复杂度主要取决于排序的时间,太慢了,不具体写了。


方法二:减治法 —— 时间复杂度 O(n)

我们可以用candidate来储存临时认为的主元素,count来记录在已遍历序列内主元素与非主元素的个数之差。最初:count=0.。对序列a[0 : n-1]遍历:

分治与递归 | 5:主元素问题的三种解法相关推荐

  1. 元素隐藏的三种方式对比(针对移动端项目中的按钮,先隐藏且不能被点击 visibility:hidden)

    元素隐藏的三种方式对比 display:none opacity:0 visibility:hidden 项目需求 表面一个图片遮罩,鼠标hover遮罩消失,内部元素展现,其中有一个按钮在移动端是手指 ...

  2. JAVA 取出Map元素值 的三种方法

    JAVA 取出Map元素值 的三种方法: (1)方法一: 通过Map的keySet()方法获取key 的set ,迭代set元素(每个元素调再用Map的get()方法); (2)方法二 : 通过Map ...

  3. Java 数组元素倒序的三种方式

    将数组元素反转有多种实现方式,这里介绍常见的三种. 直接数组元素对换 @Test public void testReverseSelf() throws Exception {System.out. ...

  4. php递归实现sum函数,php递归函数三种实现方法及如何实现数字累加

    搜索热词 递归函数在编程中是比较常用的一类函数,其特点是函数自身可以调用自身,但是必须在调用自身前有条件判断,否则会导致无限调用下去.本文列出了三种递归函数实现方法,第一种利用引用做参数,第二种利用全 ...

  5. Leetcode226. 翻转二叉树(递归、迭代、层序三种解法)

    目录 题目 1.层序法: 2.递归法: 1.先序遍历(中左右) 2.后序遍历(左右中) 3.递归中序遍历为什么不行(左中右) 3.迭代法: 1.先序遍历 2.中序遍历 3.后序遍历 为什么迭代法的中序 ...

  6. js中设置元素class的三种方法小结

    一.el.setAttribute('class','abc'); 复制代码 代码如下: <!DOCTYPE HTML> <HTML> <HEAD> <met ...

  7. 前端:JS/32/form对象(表单)(form对象的属性,方法和事件),受返回值影响的两个事件(onclick事件,onsubmit事件),获取表单的元素对象的三种方式,表单的提交和验证方法总结

    form 对象(表单) 一个<form>标记,就是一个<form>对象: 1,form对象的属性 name :表单的名称,主要用来让JS来控制表单: action :表单的数据 ...

  8. 二叉树层序遍历分层[递归迭代两种思想+三种解法]

    层序遍历分层的递归迭代解法 前言 一.二叉树层序遍历分层 二.递归与迭代 总结 参考文献 前言 层序遍历作为二叉树遍历的基本遍历,一般来说只能用迭代来解.但是分层输出则既可用迭代,又可配合level用 ...

  9. html页面获取元素,JavaScript中获取HTML元素值的三种方法

    JavaScript中取得元素的方法有三种:分别是: 1.getElementById() 方法:通过id取得HTML元素. 2.getElementsByName()方法:通过name取得元素,是一 ...

最新文章

  1. java retentionpolicy_Java注解之如何利用RetentionPolicy.SOURCE生存周期
  2. WebView宽度自适应
  3. kubernetes的安装
  4. Apache RocketMQ 的 Service Mesh 开源之旅
  5. 如何自定义SAP Spartacus店铺的界面颜色风格
  6. C++ 快速排序算法
  7. java单线程上锁_关于Java多线程编程锁优化的深入学习
  8. linux编译lnx文件命令_Linux命令总结
  9. Chrome禁用缓存
  10. 第六届开源操作系统年度技术会议将在12月16日杭州浙江大学举办
  11. js图片url反转file文件
  12. 基于ARM+FPGA低成本高实时Ethercat运动控制器解决方案
  13. 到了2017还在苦等房价下跌的人,你们可以醒醒了!
  14. 工地信息化——施工现场网格化管理系统实施小记
  15. 我的单车游记:向西,向西,到栖霞去(一)
  16. Java基础篇之三----Java简介
  17. 数据库的概念设计与逻辑设计
  18. 如何查看ORACLE各个表空间的使用情况
  19. linux ps -ef和ps -aux,关于Linux中ps -aux的深入理解
  20. 编程获得CPU的主频

热门文章

  1. 免费的网络带宽、延迟、丢包测试工具 HoloWAN_Recorder_Pro_v2.1.0 安卓端
  2. zip压缩指定文件、目录
  3. 安卓手机软件开发_面向小白:安卓手机用户的福音,一键提升手机性能
  4. 来了阿里终于知道专科如何进大厂
  5. C/C++ 模拟小型数据库系统(DBMS)
  6. 解决linux下mysql初始密码或者密码忘记
  7. Win11跳过联网激活
  8. centos7.5安装懒人工具autojump
  9. zzulioj1049:平方和与立方和
  10. android:visibility的VISIABLE,INVISIABLE,GONE的区别