Boyer-Moore 投票算法(摩尔投票法)

2023-10-27

摩尔投票法简单来说就是在不影响或者增大众数在整个数组中的地位的情况下去消除无关数字带来的影响,只需遍历一遍数组即可找到众数。

算法流程:

先随机假设一个数x为候选数(可以假设数组的第一个数),并尝试维护一个count计数器(开始设置为0.设置了众数后置1)。
接着对数组进行循环,
1、如果说循环到的数和候选数相同,
那么就count+1。
2、如果说和x不一样,则count-1。
3、当count回归到0时,对于众数的选择则重新开始(重新选择目前循环到的数为众数)。

比如说现在有【1 2 1 1 2】 一共5个数,当循环 【1 2】结束,count会重置为0。
试考虑如下几种情况:
1、如果1和2包含了众数,那么众数少了一个和非众数少了一个,并不会影响众数在整个数组中的地位。所以可以重新开始选择。
2、如果都不包含众数,那么众数的地位只会更加上升,到最后统计出来一定会是一个更大的正数count值。
PS:1和2不可能同时为众数。
我们通过举例法验证这一思想。

下面是力扣上的一个例题
在这里插入图片描述

两种解法:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        // 常规map统计法
        // map<int ,int > mp;
        // int MaxNum = 0;
        // for(int i = 0; i < nums.size();i++){
        //     mp[nums[i]]++;
        //     if(mp[nums[i]]>nums.size()/2){
        //         MaxNum = nums[i];
        //     }
        // }
        //摩尔投票法
        int cand = nums[0];//候选数
        int ans = 0;
        int count = 1;//计数

        for(int i = 1;i< nums.size();i++){
            if(count == 0){
                cand = nums[i];    
            }
            if(nums[i]==cand)
                count++;
            else{
                count--;
            }    
        }

        return cand;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Boyer-Moore 投票算法(摩尔投票法) 的相关文章

  • 交换律和结合律

    交换律和结合律 加法交换律 A B B A 交换两个加数的位置 结果不变 乘法交换律 AB BA 交换两个因数的位置 结果不变 加法结合律 A B C A B C 三个数相加 先计算前两个数再计算第三个数的结果与先计算后两个数再计算第一个数

随机推荐

  • linux文件操作常见考题_linux试题

    1 当登录Linux时 一个具有唯一进程ID号的shell将被调用 这个ID是什么 B A NID B PID C UID D CID 2 用vi打开一个文件 如何用字母 new 来代替字母 old A A s old new g B s
  • js中null、NaN和undefined的区别

    1 js中null NaN和undefined的区别 在js 中未定义的值 是null 定义未赋值为undefined null 为特殊的一种object NAN 为特使一种number 数据类型
  • 【python】基础课程 在这里哦

    推荐一些Python学习资料 如果你是准备学习Python或者正在学习 下面这些你应该能用得上 Python所有方向的学习路线图 清楚各个方向要学什么东西 100多节Python课程视频 涵盖必备基础 爬虫和数据分析 100多个Python
  • pysot训练自己数据集

    pysot如何训练网络呢 有没有人知道呢 咱们可以互相交流
  • 【通信基础】通信基础、编码&&调制

    https www jianshu com p 128c1157eb97 原文地址 1 通信基础 编码 调制 1 物理层的基本概念 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流 而不是指具体的传输媒体 物理层的主要任务 确定与传
  • python水印倾斜_python中图像特定位置的水印算法

    目前我正在处理一个图像处理项目 在这个项目中 我需要将图像分割成几个片段 然后在每个片段上应用水印 在 我写了一个代码 通过掩蔽将图像分成几段 您可以找到代码here 现在我想在每个片段上实现水印 水印教程可以在here找到 在 我该怎么做
  • LeetCode--初级算法--数组篇--第二题--买卖股票的最佳时机 II

    GitHub地址 题目 给定一个数组 它的第 i 个元素是一支给定股票第 i 天的价格 设计一个算法来计算你所能获取的最大利润 你可以尽可能地完成更多的交易 多次买卖一支股票 注意 你不能同时参与多笔交易 你必须在再次购买前出售掉之前的股票
  • 淘宝SEO珍贵笔记

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 分享淘宝SEO技术 讲诉如何使用 关键词 带来百万IP流量 大家都有目共睹淘宝七月八号改变规则后引发了不少争议 后面所引起的众多卖家 围攻 淘宝之事也不仅发生过一次了 还有
  • 如何解决vcruntime140.dll找不到的问题?两种方法教你解决

    当你在运行某些应用程序或游戏时 可能会遇到一个错误提示 即 找不到vcruntime140 dll 文件 这是因为你的电脑中缺少了这个动态链接库文件 这个问题可能会导致你无法正常使用某些应用程序 在本文中 我们将介绍两种方法来解决 目录 一
  • 树莓派安装Ubuntu22.04后使用X86_Linux交叉编译Qt5+opencv4

    文章目录 准备工作 环境搭建 准备编译 未完待续 准备工作 树莓派安装Ubuntu 直接从官网下载对应的镜像烧写工具下载地址 工具里面准备好了对应的镜像地址 直接烧写入SD卡就行了 进入系统 ubuntu server22 04默认密码应该
  • k8s 使用GlusterFS做持久化存储

    一 创建GlusterFS 首先找几台主机做GlusterFS存储 这里用了3台主机 10 244 0 10 10 244 0 11 10 244 0 12 安装GlusterFS 安装过程如下 安装 gluster 源 yum insta
  • 【数据结构】图解八大排序(上)

    文章目录 一 排序简介 二 直接插入排序 三 希尔排序 四 直接选择排序 五 堆排序 六 冒泡排序 七 冒泡排序与直接插入排序效率对比 一 排序简介 生活中 我们经常能看到排序的应用 例如 我们在网购商品的时候 经常按销量从高到低排序 常见
  • C语言经典100例题(38)--求一个3 * 3矩阵对角线元素之和

    目录 题目 问题分析 代码 测试结果 题目 求一个3 3矩阵对角线元素之和 问题分析 利用双重for循环控制输入二维数组 再将 a i i 累加后输出 代码 include
  • SpringBoot2.x使用缓存注解操作Redis

    为了进一步简化 Redis 的使用 Spring还提供了缓存注解 使用这些注解可以有效简化编程过程 缓存管理器和缓存的启用 Spring 在使用缓存注解前 需要配置缓存管理器 缓存管理器将提供一些重要的信息 如缓存类型 超时时间等 Spri
  • 低代码开发工具到底是给“谁”用的?

    不同的工具 受众也不一样 你不要认为 低代码开发工具 只有一种 实际上它分 3 种 第一种 企业级低代码开发平台 这种通常是给专业开发人员使用的 但也没有限制得很死 只要你懂编程逻辑 能写sql语句 就基本会用 就连专业的产品经理也可以用来
  • Vue实现多文件上传功能(前端 + 后端代码)

    开发项目的时候 用到文件上传的功能很常见 包括单文件上传和多文件上传 上传各种类型的文件 在vue里面要实现多文件上传功能 还是很方便的 本文就一起来学习一下 如何把多文件上传功能封装成一个组件 后面需要使用的时候 直接两三行代码就能搞定
  • 已解决(Python爬虫requests报错)requests.exceptions.ProxyError: HTTPSConnectionPool

    成功解决 Python爬虫requests报错 requests exceptions ProxyError HTTPSConnectionPool 文章目录 报错信息 报错翻译 报错原因 解决方法 千人全栈VIP答疑群联系博主帮忙解决报错
  • Unix域编程流程简单梳理

    文章目录 Unix域编程作用 Unix域编程流程 Unix域编程的地址格式 Unix编程注意事项 Unix编程简单示例 客户端实例 服务端实例 Unix域编程作用 Unix域编程用于同一台主机内部的进程之间的客户端 服务端通信 使用和网络s
  • 什么是LTS、Alpha、Beta、Dev、Release、Patch版本,软件的开发周期有多少种命名

    根据Wikipedia 2023 Software release life cycle显示 软件的开发周期版本命名有以下几种 Pre alpha Dev Alpha Beta Perpetual beta Open and closed
  • Boyer-Moore 投票算法(摩尔投票法)

    摩尔投票法简单来说就是在不影响或者增大众数在整个数组中的地位的情况下去消除无关数字带来的影响 只需遍历一遍数组即可找到众数 算法流程 先随机假设一个数x为候选数 可以假设数组的第一个数 并尝试维护一个count计数器 开始设置为0 设置了众