选择绝对众数

来源:互联网 发布:租车app源码 编辑:程序博客网 时间:2024/05/18 01:21

绝对众数的概念表示序列中的唯一众数,且出现的次数大于N2N表示序列的长度。
实际上在序列中如果某个数的出现次数超过该序列长度的一半,那么该数一定是唯一的众数。

解决这个问题的办法有多:
1.排序,时间复杂度为O(nlogn),返回nums[N/2]。
2.使用hash,时间复杂度可以降低到O(n),但需要额外的空间复杂度。

有更好的办法,O(n)的时间复杂度O(1)的空间复杂度。

从人的角度来看待这个问题,可以这样来做:从序列中,每次挑选两个不一样的数,从序列中删除,剩下最后的数一定是绝对众数。
比如说序列 [1 2 5 3 3 3 3]
删掉(1,2)
删掉(5,3)
剩下的都是相同的为所求。

根据这个思路,可以这样做。
1、对于计算机来说,它只能从头到尾对数组进行遍历,没有办法去挑两两不同的元素,为了模拟上述过程,我们定义一个count和一个表示当前可能成为“多数派”的元素candidate。
2、.在一次扫描中,如果元素和当前candidate相同则count++,不同则count-–,表示删除一对两两不同元素,当count减为0时,我们就需要更新我们的candidate了。

代码

class Solution {public:    int majorityElement(vector<int>& nums) {        int count=0;        int candidates=nums[0];        int size=nums.size();        for(int i=0;i<size;++i)        {            if(count==0)            {                candidates=nums[i];                count=1;            }            else            {                if(candidates==nums[i])                {                    ++count;                }                else                {                    --count;                }            }        }        return candidates;    }};
1 0