解题思路:
一)哈希
既然总存在多数元素,也就是目标元素个数总大于总元素的一半,那么可以用哈希表遍历数组,将每个数存进去,同时计算相同元素的个数,如果有元素的个数大于总数一半,返回该元素
lt = {}
for i in range(len(nums)):
lt[nums[i]] = lt.get(nums[i],0)+1 #将每个元素加入并计算个数
if lt[nums[i]] > len(nums)/2:
return nums[i]
二)排序计算
由于多数元素占比超过一半,那么排序后中间的元素必定是多数元素,返回
nums.sort()
return nums[len(nums)//2]
三)摩尔投票
这种方法很有意思,我也刚接触。简单来说就是从多个数选出一个个数最多的,思想就是元素两两对比,若不同将他俩过滤掉,相同的话保存,最后剩下的就都是相同的数,也就是多数。
设置初始flag标识为0,计数器为零,先保存第一个数对比,往后遍历列表元素,若相同就将计数器加一表示该种数据个数,不同就将计数器减一,当计数器为零时说明该元素库存没有了,那就把下一个将要遍历的元素当做保存元素接着对比,循环,最后保存元素就是要返回的元素。本题中多数元素占比过半,最差就是保存元素就剩下一个
下图为本人对其理解,清空并不是真正清空而是要换了对象
temp = 0 #保存元素
count = 0 #计数器
for i in range(len(nums)): #遍历列表
if count == 0:
temp = nums[i] #确定保存元素
count += 1
elif nums[i] == temp: #相等个数加一
count += 1
else:
count -= 1 #否则减一
return temp #最后的保存元素