绝对众数的概念表示序列中的唯一众数,且出现的次数大于
N2
,
N
表示序列的长度。
实际上在序列中如果某个数的出现次数超过该序列长度的一半,那么该数一定是唯一的众数。
解决这个问题的办法有多:
1.排序,时间复杂度为
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;
}
};