169. Majority Element

来源:互联网 发布:文件制作软件 编辑:程序博客网 时间:2024/06/03 15:23

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.


分析摘自

http://www.bubuko.com/infodetail-606702.html

http://www.bubuko.com/infodetail-541502.html


Moore投票算法: 我们维护一个当前的候选众数和一个初始为0的计数器。遍历数组时,我们看当前的元素x:

如果计数器是0, 我们将候选众数置为 x 并将计数器置为 1

如果计数器非0, 我们根据x与当前的候选众数是否相等对计数器+1或者-1

一趟之后, 当前的候选众数就是所求众数. 时间复杂度 = O(n).


对于Majority Element来说,它的个数超过了所有其它元素的总和。所以,对一个数遇到的次数进行计数,遇到相同的,次数加1,遇到不同的次数减1。如果计数值为0了,那么换一个数组中的元素进行计数,直到最后剩下计数值不为0的元素,就是要找的。可以想想,假若之前出现过其它的元素用于计数,设为a,那么a的次数肯定会被减为0;而若中间出现过Majority Element,但是计数被减为0了,这里可以想想,剩下的元素中,Majority Element剩余的个数肯定也是大于剩余长度的一半的,因为既然前面都被消灭光了,前面出现的次数肯定小于等于前面长度的一半,剩余的长度里面出现的次数肯定大于剩余长度的一半。


public int majorityElement(int[] nums)     {        int count=0, ret = 0;        for (int num: nums)        {            if (count==0)                ret = num;            if (num!=ret)                count--;            else                count++;        }        return ret;    }


0 0
原创粉丝点击