其他分享
首页 > 其他分享> > 摩尔投票法

摩尔投票法

作者:互联网

目录

229. 求众数 II

思路

方法一:哈希统计

用哈希统计数组中每个元素出现的次数。

方法二:摩尔投票法

摩尔投票法:摩尔投票法的核心思想为对拼消耗。首先我们考虑最基本的摩尔投票问题,比如找出一组数字序列中出现次数大于总数一半的数字(并且假设这个数字一定存在)。我们可以直接利用反证法证明这样的数字只可能有一个。

假设投票是这样的,[A, C, A, A, B],ABC 是指三个候选人。

摩尔投票法分为两个阶段:抵消阶段和计数阶段。

摩尔投票法经历两个阶段最多消耗 O(2n) 的时间,也属于 O(n) 的线性时间复杂度,另外空间复杂度也达到常量级。

本题是在任意多的候选人中,选出票数超过⌊ 1/3 ⌋的候选人。可以这样理解,假设投票是这样的 [A, B, C, A, A, B, C],ABC 是指三个候选人。

代码

class Solution {
    public List<Integer> majorityElement(int[] nums) {
        // 创建返回值
        List<Integer> res = new ArrayList<>();
        if (nums == null || nums.length == 0) return res;
        // 初始化两个候选人candidate,和他们的计票
        int cand1 = nums[0], count1 = 0;
        int cand2 = nums[0], count2 = 0;

        // 摩尔投票法,分为两个阶段:配对阶段和计数阶段
        // 配对阶段
        for (int num : nums) {
            // 投票
            if (cand1 == num) {
                count1++;
                continue;
            }
            if (cand2 == num) {
                count2++;
                continue;
            }

            // 第1个候选人配对
            if (count1 == 0) {
                cand1 = num;
                count1++;
                continue;
            }
            // 第2个候选人配对
            if (count2 == 0) {
                cand2 = num;
                count2++;
                continue;
            }

            count1--;
            count2--;
        }

        // 计数阶段
        // 找到了两个候选人之后,需要确定票数是否满足大于 N/3
        count1 = 0;
        count2 = 0;
        for (int num : nums) {
            if (cand1 == num) count1++;
            else if (cand2 == num) count2++;
        }

        if (count1 > nums.length / 3) res.add(cand1);
        if (count2 > nums.length / 3) res.add(cand2);

        return res;
    }
}

标签:nums,张票,摩尔,num,投票,抵消,候选人
来源: https://www.cnblogs.com/luedong/p/15438325.html