上帝视角:我们将nums
中的元素依次和真正的众数mode
去比,是+1
,否-1
,用val
来记录。
平民视角:设置一个计数器。首先我们将nums
的第一个元素设置成众数,依次和后面的数去比较。和此众数相同则+1
,不同则-1
。当count=0
时,记下一个元素为众数。重复此步骤。
示例如下
$$
nums:[7,7,5,7,5,1|5,7|5,5,7,7|7,7,7,7]\\ count:[1,2,1,2,1,0|1,0|1,2,1,0|1,2,3,4]\\ val: [1,2,1,2,1,0|-1,0|-1,-2,-1,0|1,2,3,4]
$$
我们可以发现,count
要么和val
相等,要么相反。因此我们可以用过count
来找到众数。count
为负时我们将其取正即可,即当count=-1
,令count=1
。
下面是关于用Boyer-Moore算法求众数的示例。平均时间复杂度为O(n),平均空间复杂度为O(1)。
C++代码实现
class Solution {
public:
int majorityElement(vector<int>& nums) {
int mode = -1;
int count = 0;
for (int num : nums) {
if (num == mode)
++count;
else if (--count < 0) {//否则count自减1并且进行是否为0判断
mode = num;
count = 1;//相当于变成val
}
}
return mode;
}
};
Python代码实现
def majorityElement(self, nums: List[int]) -> int:
mode,count=None,0
for num in nums:
if count==0:
mode=num
count+=(1 if num==mode else -1)
return mode
参考文献