定义:序列中的多数元素是指在一个元素个数为n的序列中,多数元素出现次数大于[n/2].

寻找元素方法很多:

1.可以暴力搜索,将每个元素都与其他元素作比较,然后统计该元素出现的次数,时间复杂度为O(n2);

2.可以先排序,然后再统计每个元素出现的次数,时间复杂度为O(nlogn);

3.可以寻找中间值元素,因为多数元素在序列中必为中间值元素,时间复杂度是O(n);(寻找中间值元素可以运用寻找第k小元素算法:http://www.cnblogs.com/7hat/p/3411756.html)

这里要介绍第4种方法,时间复杂度也是O(n),但是隐藏常数会比寻找中间值的方法要小。

算法基于以下观察:在原序列中去除两个不同的元素后,那么在原序列中的多数元素在新序列中还是多数元素。

算法基本思路:

(1)在寻找多数元素的过程中,将计数器置1,遇到相同元素则计数器加1,遇到不同元素则计数器减1,一直到计数器等于0或遍历完整个序列。由此可见,计数器的值表示当前元素抵消掉不同元素后的出现次数;

(2)当计数器在遍历完整个序列前就已经是0,则忽略掉已经遍历过的元素(可以看作两两抵消不影响序列中的多数元素),跳到下一个元素然后计数器重新置1,重复上述步骤,一直到遍历完整个元素;

(3)当遍历完整个序列后,算法会返回一个值,此时我们还需要检测一次这个值是否真的是多数元素,即遍历统计一次。这一步不可或缺。因为上述两个步骤到了遍历完序列后必将返回一个值,无论序列有无多数元素。此值存在三种情况,第一,它真的是多数元素;第二,它只是序列后面的某个元素刚好抵消完序列;第三,两者皆是。我们必须检测一次。

算法的实现:

基本上和上面思路一样,这里我给出递归代码和迭代代码。需要注意的是,因为有可能不存在多数元素,所以需要一个boolean变量来表示是否找到。

public classmajority{private static booleanflag;private static int candidate(int k, int[] A){//find the candidate may be a majority

int i =k;int x =A[k];int count = 1; //indicates the current element occurrences, after offset different elements

while(i < A.length-1 && count > 0){//remove two different elements, the majority element will not change

i ++;if(A[i] ==x){

count++;

}else{

count--;

}

}//there are three cases of x: x is the majority element or x is the last element or both

if(i == A.length-1)returnx;return candidate(i+1, A);

}public static int findMajority(int[] A){//find the majority

int x = candidate(0, A);int count = 0;for(int i = 0; i < A.length; i ++){//Test whether x is really the majority of elements in the array

if(A[i] ==x){

count++;

}

}if(count > A.length/2){

flag= true;returnx;

}else{

flag= false;return 0;

}

}public static int findMajority1(int[] A){//Iteration

int x = 0;for(int i = 0; i < A.length; i ++){int count = 1;

x=A[i];while(i < A.length-1 && count > 0){

i++;if(A[i] ==x){

count++;

}else{

count--;

}

}

}int count = 0;for(int i = 0; i < A.length; i ++){if(A[i] == x)count ++;

}if(count > A.length/2){

flag= true;returnx;

}else{

flag= false;return 0;

}

}public static voidmain(String[] args){int[] A = {2, 3, 2, 4, 2};int x1 =findMajority(A);if(flag){

System.out.println("Found it: " +x1);

}else{

System.out.println("Not found!");

}int x2 =findMajority1(A);if(flag){

System.out.println("Found it: " +x2);

}else{

System.out.println("Not found!");

}

}

}

Java

python寻找多数元素_寻找多数元素相关推荐

  1. python 唯一元素_检查所有元素在Python中是否唯一

    python 唯一元素 Here, we are implementing a python program to check whether all elements of a list are u ...

  2. html5语义化标记元素_语义HTML5元素介绍

    html5语义化标记元素 Semantic HTML elements are those that clearly describe their meaning in a human- and ma ...

  3. python 寻找完美数_寻找完美的鼠标

    python 寻找完美数 I have a small problem. I'm always looking for great computer mice. I've tried a number ...

  4. python自动化处理隐藏元素_处理隐藏元素

    我试图刮一个网站,问题是,我不能与网站上的隐藏元素互动.代码如下: 单击之前li class="header-nav__item login header-item-is-hidden&qu ...

  5. python两点之间最短距离_寻找两点之间的最短距离Python

    我有两个数据框.一个包含properties locations,另一个包含railway stations locations. 属性数据框样本(原始数据框由约700行组成): properties ...

  6. java删除指定索引元素_将对象/元素添加到列表中的Java指定索引处

    java删除指定索引元素 We have to create a List and add objects/elements to the List and given indexes in java ...

  7. vue移除伪元素_获取伪元素的属性和改变伪元素的属性

    获取伪元素的属性值 获取伪元素的属性值可以使用window.getComputedStyle()方法,获取伪元素的CSS样式声明对象.然后利用getPropertyValue方法或直接使用键值访问都可 ...

  8. 未能比较数组中的两个元素_算法3 寻找两个正序数组的中序数

    问题描述: 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数.要求设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题. ...

  9. python:无序数组中寻找第K大的元素

    题目: 所谓"第(前)k大数问题"指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题. 解法1:堆排序 采用元素下沉法,维护一个k大小的最小堆, ...

最新文章

  1. 【计算机系统设计】重点 · 学习笔记(0)
  2. jq之$(“ul li:first-child“)
  3. 【项目管理】敏捷和Scrum
  4. java 监听多个按键_如何在所有组件中监听按键(在Java Swing中)?
  5. 【kafka】kafka 控制台 消费 ip 却找 域名 报错 Can‘t resolve address UnresolvedAddressException
  6. reactos操作系统实现(109)
  7. 在管家婆软件中项目管理教程
  8. 数学建模【开会总结】
  9. python查看opencv版本
  10. Radon变换与Matlab代码
  11. 批量图片验证模型错误: OP_REQUIRES failed at save_restore_v2_ops.cc:184 : Not found: Key conv1_1/bias not found
  12. 5分钟快速入门大数据、数据挖掘、机器学习
  13. 阴阳师android转ios,阴阳师手游IOS自动刷御魂?IOS切换控制教程[多图]
  14. 2.3 伯努利试验和直线上的随机游动
  15. . java.lang.IllegalArgumentException: requirement failed: Can only call getServletHandlers on a runn
  16. monkey的基本操作命令
  17. 新电脑如何分盘---傻瓜式教学
  18. 一小时搭建实时数据分析平台
  19. 手把手教你做20道菜全套教程
  20. 用低代码让数字化触手可及,奥哲完成数亿元C轮融资

热门文章

  1. dumpstack_Java Thread类的静态void dumpStack()方法(带示例)
  2. Java生成随机数的4种方式,以后就用它了!
  3. 分布式ID生成的9种方法,特好用!
  4. python http 返回json中文乱码
  5. 搭建nginx+php后访问不到项目
  6. EasyExcel入门使用
  7. python用户输入算式并计算_Python基础学习之计算和算式
  8. ui测试怎么做?依据文档有哪些_微信小程序开发流程有哪些?各个环节注意事项...
  9. 口腔取模过程及注意事项_取模变形?教你三种方法,轻松防止取模变形!
  10. matlab 图像显著性检测ft_全局对比度的图像显著性检测算法