力扣刷题篇——摩尔投票算法

简介: 力扣刷题篇——摩尔投票算法

1.什么是摩尔投票法


在⼀个⽆序数组中,存在⼀个数,它出现的次数⼤于数组长

度的⼀半。输出这个数

⼀、排序、遍历

⼆、摩尔投票法

摩尔投票算法是⼀种使⽤线性时间和常数空间查找⼤部分元素序列的算法。

最简单的形式就是,查找输⼊中重复出现超过⼀半以上(必须⼤于n/2,等于不算)的元素。如果序列中没有这种元素,算法不能检测到正确结

果,将输出其中的⼀个元素之⼀。

如果不能保证输⼊数据中有占有⼀半以上的元素,需要再遍历⼀下验证。

满⾜两个先决条件

1、出现超过⼀半以上(n/2)的元素有且只有⼀个;

2、这个元素⼀定存在

算法步骤

我们维护⼀个局部变量作为当前查找元素,⼀个局部变量作为计数器,

当遍历开始的时候,此时计数(count)为0,则将数组第⼀个元素作为当前查找元素;

当遍历的元素与查找元素相等,计数加1;反之则-1;

若当计数为0时,将下⼀个元素作为当前查找元素,继续重复以上操作;当遍历结束时,当前查找元素则为⽬标元素


摩尔投票法分为两个核心步骤

投票阶段:投票人之间票数进行抵消

计数阶段:计算对抗结果最后剩下的那个候选人的票数是否有效


2.例题


题目来自LeetCode

169 多数元素

题目要求 :


49da59296fe54ac7a199ebe79a3cbd3d.png

169. 多数元素 - 力扣(LeetCode) (leetcode-cn.com)

解题思路:

1.我们先定义一个候选人 就是数组的第一个元素

2.然后定义一个记录候选人次数的count 初始化count

3.然后for循环遍历 如果有候选人那么我们的count就++,反之则- -

4.如果count为0时,就更换候选人

c356ca1b3a45421b82fb9b8302ecef8c.png


3b9ebcab8f1e4a44b1ec126b2bd1e886.png


c4335d882f294e988fba2ffcce7175b0.png

af6040fdf2ee440b9eebc8f072435d0c.png


e12ce472db5b4048bb69481c1f73a80d.png

c81d37b380f14927b091d788a5e37336.png


aa5ba47f530d45f6bc7d2f786d467b16.png


源码附上:

class Solution {
    public int majorityElement(int[] nums) {
        int len=nums.length;
        int major=nums[0];//遍历第一个元素,候选人是2
        int count=0;
        for(int i=0;i<len;i++){
             //如果数组中还有2的话我们的count就++;
             if(nums[i]==major){
                 count++;
             }else{
                 //如果没有就减1
                 count--;
             }
             //如果count=0的时候就更换候选人
             if(count==0){
                //更换候选人
                major=nums[i];//重新赋值major
                //票数重置为1
                count=1;
             }
        }
        return major;
    }
}

这种情况只能对于多数存在的情况下 比如[4,5,6]major等于6显然是错误的

所以对于不一定存在多数的情况下 我们需要在求出major的情况下 在遍历一遍

统计count的次数是否大于数组长度的一半

1710.主要元素

题目描述:

138408f1e2374dec87cd1a8b60c3cbe8.png

源码附上:

class Solution {
    public int majorityElement(int[] nums) {
        int len=nums.length;
        int major=nums[0];//遍历第一个元素,候选人是2
        int count=0;
        for(int i=0;i<len;i++){
              if(count==0){
                //更换候选人
                major=nums[i];//重新赋值major
                //票数重置为1
             }
             //如果数组中还有2的话我们的count就++;
             if(major==nums[i]){
                 count++;
             }else{
                 //如果没有就减1
                 count--;
             }
             //如果count=0的时候就更换候选人
        }
        count=0;
        for(int num:nums){ //遍历一遍 记录count的次数
            if(num==major){
                count++;
            }
        }
        return(count<=len/2)?-1:major; //根据条件判断如果长度超过数组长度的一半 就输出major
        反之则输出-1
    }
}

以上就是小王同学给大家带来的两道经典的摩尔投票法的例题



相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
41 0
|
29天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
35 1
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
|
算法
【链表】算法题(二) ----- 力扣/牛客
【链表】算法题(二) ----- 力扣/牛客
|
2月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
17 0
|
2月前
|
算法
【链表】算法题(一) ----- 力扣 / 牛客
【链表】算法题(一) ----- 力扣 / 牛客
|
2月前
|
算法
【顺序表】算法题 --- 力扣
【顺序表】算法题 --- 力扣
|
4月前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
76 1
测试工程师的技能升级:LeetCode算法挑战与职业成长