python寻找多数元素_寻找多数元素

定义:序列中的多数元素是指在一个元素个数为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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac 电脑安装 svn和brew

快速解决&#xff1a; 1. 安装svn brew install subversion 2. 安装brew 记得多尝试分别选择不同的下载源&#xff0c;鄙人最终是选择 “3 北京外国语大学” 成功的。 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"折…

监控mysql锁定状态_企业实战Mysql不停机维护主从同步

实战环境&#xff1a;Mysql-5.7Xtrabackup-2.4Xtrabackup 介绍&#xff1a;Percona XtraBackup是一款基于MySQL的服务器的开源热备份实用程序&#xff0c;在备份过程中不会锁定数据库。它可以备份来自MySQL5.1&#xff0c;5.5&#xff0c;5.6和5.7服务器上的InnoDB&#xff0c;…

Mac AndroidStudio常用快捷键

mac电脑的键盘修饰符对应关系 Command&#xff08;或 Cmd&#xff09;⌘Shift ⇧Option&#xff08;或 Alt&#xff09; ⌥Control&#xff08;或 Ctrl&#xff09;⌃Caps Lock ⇪esc ⎋Fn F6-F12的使用 单独按F6-F12&#xff0c;一般是控制电脑的音量、音乐上下曲的切换&a…

python缺失值类型与分析_3.1.1 缺失值分析

数据的缺失主要包括记录的缺失和记录中某个字段信息的缺失&#xff0c;两者都会造成分析结果的不准确&#xff0c;以下从缺失值产生的原因及影响等方面展开分析。(1)缺失值产生的原因1)有些信息暂时无法获取&#xff0c;或者获取信息的代价太大。2)有些信息是被遗漏的。可能是因…

为什么Mac source ~/.bash_profile只生效一次(macOS Catalina)

目录Mac环境变量的设置每次都要执行source ~/.bash_profile才有效解决方法(任选一种即可)一. 环境变量添加到.zshrc二 .zshrc中 添加source ~/.bash_profile三 切换mac的shell是什么原因Mac环境变量的设置 开发中对环境变量的修改和增加比较普遍&#xff0c;此处做为记录也供大…

三相四线怎样查漏电_老电工支招!漏电保护器的接线方法

家居装修中&#xff0c;电路问题是比较重要的&#xff0c;尤其是现在家居中使用的电器越来越多&#xff0c;所以漏电保护器是一定要的&#xff0c;能有很好的保护作用&#xff0c;那漏电保护器接线图是怎样的呢&#xff0c;漏电保护器接线方法以及注意事项有哪些&#xff0c;快…

view.post不执行的坑点

view.post没执行&#xff0c;runOnUiThread&#xff0c;Handler 目录坑点处理原因经历复盘6.0版本10.0版本总结坑点 子线程执行view.post(Runnable) 部分 手机没有效果。 usernameEditText.post(new Runnable() {Overridepublic void run() {usernameEditText.setText("…

扫地机器人划伤地板_扫地机器人哪个牌子好?会选的才能买到好产品

做为一种既时尚潮流又智能化的家用电器,扫地机器人一经面世就遭受大伙儿的关心。大家最先会感觉扫地机器人十分便捷,次之也会对它造成疑惑:就那么一台小小环形设备,确实能处理困惑人们这些年的打扫难题吗?事实上在扫地机器人的应用全过程中,客户对它的印像确实有很多种多样,有…

ThreadLocal初识

目录背景ThreadLocal的作用ThreadLocal特性ThreadLocal实现1. T get()2. set(T value)3. remove()验证一个对象只存一个数据多少个对象就能存多少个数据背景 这两天稍微有点空&#xff0c;在追溯之前的android 7.0之前的手机用View.post 出现不执行的问题时&#xff0c;结识了…

Gensee SDK UserInfo类函数详细说明

目录基本信息rolestatusclientType其他UserInfo是一个公共的类&#xff0c;用于RtSDK和PlayerSDK。由于role和status是复合1量&#xff0c;列出相关的判断方式&#xff0c;true为注释说明&#xff0c;false反之。 如 isHost() true 老师/false 不是老师。 基本信息 getUserId…

python中shutil模块_Python中shutil模块的学习笔记教程

介绍shutil 名字来源于 shell utilities&#xff0c;有学习或了解过Linux的人应该都对 shell 不陌生&#xff0c;可以借此来记忆模块的名称。该模块拥有许多文件(夹)操作的功能&#xff0c;包括复制、移动、重命名、删除等等一、chutil.copy(source, destination)shutil.copy()…

HTML转义字符大全<转>

为什么要用转义字符串&#xff1f; HTML中<&#xff0c;>&#xff0c;&等有特殊含义&#xff08;<&#xff0c;>&#xff0c;用于链接签&#xff0c;&用于转义&#xff09;&#xff0c;不能直接使用。这些符号是不显示在我们最终看到的网页里的&#xff0c…

python测网速_tespeed-测试网速的Python工具

1.安装(环境CentOS7)#pip install lxml#wget wget http://sourceforge.net/projects/socksipy/files/socksipy/SocksiPy%201.00/SocksiPy.zip#git clone https://github.com/Janhouse/tespeed.git#mv SocksiPy.zip tespeed/SocksiPy/#cd tespeed/SocksiPy/#unzip SocksiPy.zip#…

Gensee SDK RoleType详解

目录RoleType使用场景&#xff1a;方法与使用说明源码RoleType 接着之前的 UserInfo,对RoleType做进一步说明. 此类是SDK的公共类&#xff0c;可以在任一SDK使用方进行调用&#xff0c;之前有提到role是一个“复合”的值1&#xff0c;所以不能简单的用“” 来判断&#xff0c;…

vc 通过句柄修改窗口大小_漫画:对象是如何被找到的?句柄 OR 直接指针?

小贴士&#xff1a;想要使用并定位 Java 对象&#xff0c;就要用到 Java 虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;&#xff0c;它描述的是 Java 方法执行的线程内存模型&#xff1a;每个方法被执行的时候&#xff0c;Java 虚拟机都会同步创建一个栈帧&…

数据结构快速掌握和温习-面试神器

由于原文有部分文字没有显示&#xff0c;本文有所修改。主要包括文字和缩进。 目录 Q1&#xff1a;数据结构和算法的知识点整理&#xff1a; Q2&#xff1a;链表&#xff0c;队列和栈的区别 Q3&#xff1a;简述快速排序过程 Q4&#xff1a;快速排序算法的原理 Q5&#xff1a;简…

python阴阳师_如何用Python找到阴阳师妖怪屋的最佳探索队伍!强不强?

程序由来最初想要写这个小程序是因为&#xff0c;9月份那段时间我在玩妖怪屋。因为刚开始抽卡&#xff0c;要啥啥没有&#xff0c;所以探索队伍也只是放了几个自己记得有关联的式神。在网上有找到完整版的羁绊&#xff0c;但是怎么根据羁绊找到最佳的式神组合就成问题了。当时我…

Android iOS防录屏截屏

目录Android防录屏和截屏关于WindowManager.LayoutParams.FLAG_SECURE关于Display.FLAG_SECUREiOS防录屏和截屏监听截屏录屏监听需求与安全总是对立的&#xff0c;有新的需求&#xff0c;就有新的接口开放&#xff0c;但随之而来的就是利用新接口或者新接口的使用者&#xff08…

work节点使用外部包_AFLSmart工具简单分析及使用介绍

AFLSmart 是一个在 AFL 基础上&#xff0c;结合了 Peach 的结构化输入组件的灰盒 smart fuzz 工具。AFLSmart 链接&#xff1a;https://github.com/aflsmart/aflsmart参考资料&#xff1a;《Smart Greybox Fuzzing》什么是 AFLSmart灰盒 smart fuzz灰盒测试是基于程序运行时刻的…

Android adb 启动APP

目录启动命令一 常规命令 包名/activity二 常规命令 包名命令关闭App获取包名和activity的路径代码获取1 命令获取( 需要app运行在前台&#xff0c;停留在启动界面)2命令获取(先执行命令&#xff0c;再点击app启动)启动命令 一 常规命令 包名/activity adb shell am start…