美文网首页
使用摩尔投票法解决多数问题

使用摩尔投票法解决多数问题

作者: 秃头哥编程 | 来源:发表于2021-07-10 23:00 被阅读0次

1、什么是摩尔投票法

博耶-摩尔多数投票算法(英语:Boyer–Moore majority vote algorithm),中文常作多数投票算法摩尔投票算法等,是一种用来寻找一组元素中占多数元素的常数空间级时间复杂度算法。

这一算法应用的问题原型是在集合中寻找可能存在的多数元素,这一元素在输入的序列重复出现并占到了序列元素的一半以上;在第一遍遍历之后应该再进行一个遍历以统计第一次算法遍历的结果出现次数,确定其是否为众数;如果一个序列中没有占到多数的元素,那么第一次的结果就可能是无效的随机元素。对于数据流而言,则不太可能在亚线性空间复杂度的情况下中就寻找到出现频率最高的元素;而对于序列,其元素的重复次数也有可能很低。

上面的描述来自维基百科。过程可以分为两个阶段:

(1)投票阶段:即投票人之间票数进行抵消。

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

2、例题

在LeetCode上,有下面几题

(1)面试题 17.10. 主要元素

(2)169. 多数元素

第(1)道属于不一定存在多数元素的情况,第(2)道属于存在多数元素的情况。对于一定存在多数元素的情况,我们可以不用进行计数阶段。

所以我们直接看第(1)题,因为第一题包含了第(2)题的解法。

题目

数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。

示例 1:

输入:[1,2,5,9,5,9,5,5,5]
输出:5

示例 2:

输入:[3,2]
输出:-1

示例 3:

输入:[2,2,1,1,1,2,2]
输出:2

分析

以示例2为例,[2, 2, 1, 1, 1, 2, 2]

image-20210710224814523.png

这是存在多数元素的情况,对于不存在多数元素的情况,比如[1, 2, 3]这样的个数为奇数的序列,如果按照上面的方法,最后求的major值为3,这是一个错误的答案。

所以对于不一定存在多数元素的情况下, 我们在求得major后,需要再遍历一次,统计这个major在序列中出现的次数是否大于n / 2,即验证票数是否有效。

编码

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

        count = 0;
        for (int num : nums) {
            if (num == major) {
                count++;
            }
        }

        return (count <= nums.length / 2) ? -1 : major;
    }
}
image-20210710225239240.png

相关文章

  • 使用摩尔投票法解决多数问题

    1、什么是摩尔投票法 博耶-摩尔多数投票算法(英语:Boyer–Moore majority vote algor...

  • 摩尔投票法

    摩尔投票法又叫多数投票法。 解决的问题如何在任意多的候选人中,选出获得票数最多的那个 算法包括两个阶段 1. 对抗...

  • 169. 多数元素

    169. 多数元素 经典面试题 摩尔投票法

  • 摩尔投票法

    提问: 给定一个int型数组,找出该数组中出现次数大于数组长度一半的int值。 解决方案: 遍历该数组,统计每个i...

  • 摩尔投票法

    题目描述 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/2 ⌋ 次的元素。 分析:采用摩尔投票法,两个...

  • 摩尔投票法——1比1火拼 2020-03-17(未经允许,禁止转

    摩尔投票法的基本问题 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2...

  • 力扣(LeetCode) - 229 求众数

    本题可以摩尔投票法来解决 一、题目 给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 ...

  • LeetCode精讲:摩尔投票算法

    什么是摩尔投票算法? 摩尔投票算法是一种使用线性时间和常数空间查找大部分元素序列的算法。它以1981年出版的Rob...

  • 【leetcode解题】算法之摩尔投票法

    leetcode题目: 首先我用用了个Map,一旦出现计数超过数组长度一半,直接return。通过。但是觉得这道题...

  • LeetCode—— 多数元素

    题目描述 一、CPP 1. 摩尔投票法: 解题思路:如果我们把众数记为 +1,把其他数记为 −1 ,将它们全部加起...

网友评论

      本文标题:使用摩尔投票法解决多数问题

      本文链接:https://www.haomeiwen.com/subject/ffphpltx.html