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

news2025/1/16 11:15:56

请添加图片描述

摩尔投票算法

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

算法原理

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

算法步骤

  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.coloradmin.cn/o/755632.html

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

相关文章

【从零开始学习CSS | 第三篇】选择器优先级

目录 前言&#xff1a; 常见选择器的优先级&#xff08;从高到低&#xff09; 选择器的权重&#xff1a; 总结&#xff1a; 前言&#xff1a; 在前几篇文章中我们介绍了大量的选择器&#xff0c;那么大量的选择器在使用的时候&#xff0c;一定是有一个优先级顺序的&#xff…

graylog源码搭建

这里主要讲如何源码安装graylog 下载地址&#xff1a; https://www.graylog.org/downloads/ 下载带有JVM的源码文件源码安装 下载graylog-5.1.3-linux-x64.tgz&#xff0c;并上传到Centos中&#xff0c;执行以下操作 tar -zxvf graylog-5.1.3-linux-x64.tgzcd /etcmkdir -p …

Python GUI编程利器:Tkinker中的颜色选择对话框(15)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日目标 学习Tkinter中的颜色对话框的使用&#xff0c;实现如下效果&#xff1a; 颜色选择对话框 颜色选择对话框可以提供一…

JavaWeb 笔记——6

JavaWeb 笔记——6 一、Vue1.1、Vue-概述1.2、Vue快速入门1.3、Vue常用指令1.3、Vue生命周期1.4、查询所有-案例1.5、新增品牌-案例 二、Element2.1、Element概述2.2、快速入门2.3、Element布局2.4、常用组件 三、综合案例3.1、换件搭建3.2、查询所有3.3、新增品牌3.4、Servlet…

集群基础2——LVS负载均衡apache(nat模式)

文章目录 一、环境说明一、配置调度器网卡二、配置后端服务器三、配置调度器四、验证五、设置https负载均衡 一、环境说明 使用lvs中的nat模型&#xff0c;对apache负载均衡集群。 主机IP角色安装服务真实IP&#xff1a;192.168.161.129VIP&#xff1a;192.168.161.130调度服务…

证照之星软件怎么样?证照之星怎么换背景色

随着科技的快速发展&#xff0c;越来越多的软件应用于各个方面&#xff0c;为人们的生活和工作带来便利。今天&#xff0c;我们要介绍的就是一款证件照制作方面的软件——证照之星。那么&#xff0c;证照之星到底是什么软件&#xff1f;它好用吗&#xff1f;这篇文章将为大家详…

【PHP面试题45】cgi与fast_cgi关系是怎么样的

文章目录 一、CGI与FastCGI简介二、CGI与FastCGI的关系三、CGI与FastCGI的应用场景四、总结 一、CGI与FastCGI简介 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题&#xff0c;对标资深工程师/架构师序列&#xff0c;欢迎大家提前…

解析!1V1直播源码开发搭建技术实时语音识别翻译功能的应用

语言是我们人类交流的工具&#xff0c;它的种类繁多&#xff0c;比如世界语言&#xff0c;像是中国的汉语、英国的英语、法国的法语等&#xff1b;又或是我们中国的方言&#xff0c;像是山东话、北京话、上海话等。可谓是五花八门&#xff0c;争奇斗艳&#xff0c;每一种世界语…

MySQL的安装与卸载

1. MySQL安装 连接MySQL cmd或自带工具或Navicat 2. MSQL卸载

怎么管理酒店后勤维修工作?如何提高客户满意度?

酒店维修不及时会对客户满意度产生负面影响。当客人入住酒店时&#xff0c;如果发现设施设备出现故障或损坏&#xff0c;会直接影响客人的入住体验和满意度。如果这些故障或损坏得不到及时维修和解决&#xff0c;客人会对酒店的服务质量和信誉产生怀疑&#xff0c;可能会对酒店…

3.2.17 什么是数组及应用

【分享成果&#xff0c;随喜正能量】人这一生&#xff0c;好不好都得自己走&#xff0c;累不累都得自己承受。每个人都有难言之苦&#xff0c;每个人都有无声的泪&#xff0c;岁月可曾放过谁&#xff1f;再风光的人&#xff0c;背后都有寒凉凄楚&#xff0c;再幸福的人&#xf…

【UE4 塔防游戏系列】04-敌人沿着指定路线移动

目录 效果 步骤 一、绘制道路 二、创建出生点和路径点 三、生成敌人 四、敌人沿着路径点移动 效果 步骤 一、绘制道路 首先绘制一条道路&#xff0c;后面希望敌人会沿着这条绘制道路行走。 二、创建出生点和路径点 2.1 新建父类为Actor的蓝图&#xff0c;作为敌人出…

Docker——认识Docker 常用命令 Linux中安装docker 常见问题及其解决

目录 引出Docker是啥&#xff1f;Docker是啥&#xff1f;Docker VS 虚拟机1.特性优势2.资源优势 Docker的架构Docker常用命令&#xff08;1&#xff09;docker ps&#xff08;2&#xff09;docker stop 容器名称&#xff08;3&#xff09;docker ps -a&#xff08;4&#xff0…

css基础知识二十:说说对Css预编语言的理解?有哪些区别?

一、是什么 Css 作为一门标记性语言&#xff0c;语法相对简单&#xff0c;对使用者的要求较低&#xff0c;但同时也带来一些问题 需要书写大量看似没有逻辑的代码&#xff0c;不方便维护及扩展&#xff0c;不利于复用&#xff0c;尤其对于非前端开发工程师来讲&#xff0c;往…

[java安全]CommonsCollections3.1

文章目录 【java安全】CommonsCollections3.1InvokerTransformerConstantTransformerChainedTransformerTransformedMap如何触发checkSetValue()方法&#xff1f;AnnotationInvocationHandlerpoc利用链 【java安全】CommonsCollections3.1 java开发过程中经常会用到一些库。Ap…

【Python 基础篇】Python环境搭建

文章目录 一、Python环境的下载二、Python环境变量的安装及配置三、Python编译器的选择一、Python环境的下载 Python官方网站:www.python.org 这个是Python的官方网站,Python下载以及相关文档都能在里面找到 如果下载慢的话,可以在各大电脑应用市场下载(自己是在联想应用商…

【分布式任务调度】XXL-JOB调度中心集群部署配置(一)

文章目录 1.概述2.代码编译2.1.代码下载2.2.初始化与编译 3.集群部署3.1.服务启动3.2.反向代理 4.结语 1.概述 XXL-JOB是一款轻量级的分布式任务调度中间件&#xff0c;默认支持6000个定时任务&#xff0c;如果生产环境的任务数量在这个范围内&#xff0c;可以选择使用 XXL-JO…

【手撕C语言基础】联合体与枚举

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

九五从零开始的运维之路(其二十)

[TOC](文章目录) 文章目录 前言一、LAMP是什么二、配置环境及安装1.配置yum源2.关闭防火墙、网络图形化工具及SElinux3.安装软件包 三、配置apache服务器内容四、启动服务五、访问验证总结 前言 本篇将简述的内容&#xff1a;Linux系统下的LAMP平台部署 基于discuz框架的论坛搭…