正文
本题较为简单,但是有一些比较有趣的方法,这里特来记录一下。
普通方法
遍历整个数组,使用 count
进行统计,然后选择出现次数大于 len(nums) / 2
的元素。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
for i in nums:
if nums.count(i) > len(nums) / 2:
return i
但是很不幸,上面的方法超时了,数据多的时候时间上超过了网站给出的限制,很难受。
摩尔投票法
首先,我们需要注意,众数的元素个数大于列表整体元素数量的一半。因此,我们可以进行循环,遇到一个数我们就对它进行投票,然后接着遇到下一个数字,如果数字一致,就继续投票,如果不一致,票数 -1
。最后就获取到了众数。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
votes = 0
for num in nums:
if votes == 0: x = num
votes += 1 if num == x else -1
return x
如果列表中有除了众数以外的多个数据也无关紧要,非众数数据之间也会因为上面的操作互相减分抵消,从而增加众数的票数,最极端的情况是数组中只有众数和另外一个数据,但是众数依然会获得更多的票数。
排序法
众数排序之后,列表中间的数字即为众数
class Solution:
def majorityElement(self, nums: List[int]) -> int:
nums = sorted(nums)
return nums[int(len(nums) / 2)]
int(len(nums) / 2)
是为了防止,列表中的元素个数为奇数。
字典法(哈希)
我们也可以使用字典来处理,遇到数字,添加进入字典,最后比较 values
值,最大的即为众数。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
dict1 = collections.defaultdict(int)
for num in nums:
dict1[num] += 1
return max(dict1, key=dict1.get)
使用上述代码我们也可以完成相同的操作。
如果大家觉得有用,就请点个赞吧~