排序算法笔记--摩尔投票算法

news/2024/11/20 9:11:14/

请添加图片描述

摩尔投票算法

摩尔投票算法是一种用于在数组中查找出现次数超过一半的元素的有效算法。算法的核心思想是利用候选元素和计数器进行投票,通过消除不同元素之间的抵消来找到出现次数超过一半的元素。

算法原理

如果数组中存在一个出现次数超过一半的元素,那么这个元素的剩余部分一定会抵消其他元素的出现次数,最终剩下的就是该元素。

算法步骤

  1. 初始化候选元素 candidate 为数组的第一个元素,计数器 count 为 1。
  2. 从数组的第二个元素开始遍历。
  3. 如果当前元素与候选元素相同,则将计数器 count 加 1。
  4. 如果当前元素与候选元素不同,则将计数器 count 减 1。
  5. 如果计数器 count 减为零,则更新候选元素为当前元素,并将计数器 count 重置为 1。
  6. 完成遍历后,候选元素就是出现次数超过一半的元素。

实例

例子:

假设数组为 [2, 2, 1, 1, 1, 2, 2]。

  • 初始时,候选元素 candidate 为 2,计数器 count 为 1。
  • 开始遍历数组:
    • 遍历到 2,与候选元素相同,计数器 count 加 1,计数器变为 2。
    • 遍历到 1,与候选元素不同,计数器 count 减 1,计数器变为 1。
    • 遍历到 1,与候选元素不同,计数器 count 减 1,计数器变为 0。
    • 计数器 count 变为 0,更新候选元素为当前元素 1,计数器 count 重置为 1。
    • 遍历到 1,与候选元素相同,计数器 count 加 1,计数器变为 2。
    • 遍历到 2,与候选元素相同,计数器 count 加 1,计数器变为 1。
    • 遍历到 2,与候选元素相同,计数器 count 加 1,计数器变为 0。
    • 计数器count变为0,更新候选元素为当前元素2,计数器count重置为2

完成遍历后,候选元素为 2,它是出现次数超过一半的元素

解题模板

class Solution {public int majorityElement(int[] nums) {int candidate = nums[0];int count = 1;for (int i = 1; i < nums.length; i++) {if (count == 0) {candidate = nums[i];count = 1;} else if (nums[i] == candidate) {count++;} else {count--;}}return candidate;}
}

题目:寻找发帖的水王

当水王发帖数大于一半时,直接使用模板进行解答:


public class test1 {//出现次数大于一半public int  solve(int []arr){int candidate = arr[0];int count =1;for(int i =1;i<arr.length;i++){if(count == 0){candidate = arr[i];count =1;}else if(arr[i] == candidate){count++;}else{count--;}}return candidate;}}

题目变形:当水王发帖数刚好等于一半时,需要判断寻找元素是否是最后一位

//寻找发帖水王 出现次数刚好是一半public static void solve1(int[] arr){int candidate = arr[0];int nTimes =0;int countOfLast = 0;int N = arr.length;for(int i =0;i<N;i++){if(arr[i] == arr[N-1]){countOfLast++;}if(nTimes ==0){candidate = arr[i];nTimes =1;continue;}if (arr[i] == candidate){nTimes++;}else{nTimes--;}}if(countOfLast == N/2){System.out.println(arr[N-1]);}else{System.out.println(candidate);}}

http://www.ppmy.cn/news/894644.html

相关文章

10kv电压互感器型号_高压互感器型号含义

1 &#xff0e;互感器的分类 (1) 按用途分为&#xff1a;电压互感器和电流互感器&#xff1b; (2) 按精度等级分为&#xff1a;工业用互感器 (0.2 、 0.5 、 3 级及以下&#xff0c;保护和控制用 ) 和标准互感器 (0.1 级以上 ) 。 2 &#xff0e;国产互感器型号的含义 (1) 电压…

台达编码器型号含义_光电编码器型号含义_光电编码器应用实例

光电编码器型号含义 例型号是:ZKX-6A-50BM7.5T-G05E。厂家:长春光学有限公司 型号含义如下: ZKX产品型号,外径38盲孔轴8;6A是顺序号;50BM是500脉冲,B指的是AB相位差90度,M指旋转编码器每旋转一圈有一个零位信号;7.5T指零位脉冲信号的脉冲宽度;GO5E:G指电缆测出,05指…

ibm服务器 产品型号对应表,IBM服务器配件型号及编号列表

IBM服务器硬盘型号及编号如下 146G 10K 2.5 SAS 42D0633 43X0825 42D0677 146G 15K 3.5 SAS 39R7250 10N7204 146G 10K 3.5 SAS 3K7242 300G 10K SAS 2.5 42D0638 90Y8878 00AJ097 42D0612 44V6833 44W2264 300G 15K SAS 2.5 81Y9670 85T6185 81Y9913 00Y2428 7…

倍福plc的型号_常用PLC型号大全及简介,选型必备技能!

2.三菱 FX1S:三菱PLC是一种集成型小型单元式PLC。且具有完整的性能和通讯功能等扩展性。如果考虑安装空间和成本是一种理想的选择。 FX1N:是三菱电机推出的功能强大的普及型PLC。具有扩展输入输出,模拟量控制和通讯、链接功能等扩展性。是一款广泛应用于一般的顺序控制三菱P…

三菱Q系列做modbusTCP服务器,汇川H3u与三菱Q/L系列PLC MODBUS TCP通信说明

马上注册,享受更多特权 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 汇川H3u与三菱Q/L系列PLC MODBUS TCP通信说明 MODBUS-TCP作为一种工业通信协议,在自动化设备中的应用越来越多,由于其灵活的特性(既可作客户端,又可作服务器)及强大的数据传输功能,倍受工程师…

三菱q系列 服务器,三菱中大型Q系列PLC介绍

三菱PLC分为两大类:一是FX系列PLC,是整体是结构,主机里面集成了I/O等各种功能;二是Q系列PLC,采用模块化结构,通过被板总线插槽将CPU,I/O,特殊功能模块连接起来。 一QCPU介绍 QCPU分为基本型、高性能型CPU,运动(Motion)CPU,过程CPU,计算机(PC)CPU等。 1、 基本型,…

台式计算机不同处理器型号,买电脑不要再被坑了,CPU型号解读

原标题&#xff1a;买电脑不要再被坑了&#xff0c;CPU型号解读 CPU对于电子设备的重要性&#xff0c;相信大家都有深刻的理解了&#xff0c;但是电脑的CPU并不像手机CPU一样&#xff0c;性能好坏可以简单直接地从型号数字大小看出来。电脑CPU型号带有一大串数字字母&#xff0…

stm32 操作W25Q256 W25Q16 spi flash

硬件连接 今天我使用W25Q16做了一个测试&#xff0c;发现了W25Q16内部是一个环形缓冲区&#xff0c;在0x200000地址处写入数据&#xff0c;我可以在0x000000处读取到0x200000地址的数据&#xff0c;从这里就可以正面W25Q16是一个环形缓冲区的norfalsh 本函数库来自正点原子官…