Boyer-Moore 投票算法 求众数

LeetCode 简单题目,记录一下

已知一组数中有一个数占超过半数以上,求出这个数是什么?

该算法的步骤是:首先选定第一个数作为“疑似众数”,设定计数器为1。然后往后遍历,当碰到相同的数,计数器加1,否则减去1。当计数器等于 0 时,重新选择下一个数为疑似众数,直到遍历完全部数。最终的疑似众数便是所需答案。

解释如下:分两种情况考虑,第一,选中了众数本身,则由于众数的数量比其余的数字加起来都要多,所以即时中途被停止了,也只是减去等量的众数和其他数,对最终结果不影响。第二,选中了其他的数字,此时减去等量的 其他数B 和(众数加上除了B以外的其他数),由于其他数B占比较少,所以一定会在中途计数器等于0。此时删除了更多的其他数:其他数B = 除了B以外的其他数 + 众数 >> 其他数B + 除了B以外的其他数 > 众数 , 故剩下的众数数量更加多,因此对结果没有影响。

下面给出 C++ 代码:

class Solution {

public:

    int majorityElement(vector& nums) {

        int major = nums[0];

        int count = 1;

        for(int i = 1;i < nums.size(); i++){

            if(count != 0){

                if(nums[i] != major) count--;

                else count++;

            }

            else{

                major = nums[i];

                count++;

            }

        }

        return major;

    }

};

你可能感兴趣的:(Boyer-Moore 投票算法 求众数)