1、使用字典
遍历列表,将每个不同的元素存入字典,如果已经在字典中,则加1;最后判断哪个元素的次数大于n/3。
代码
class Solution:
def majorityElement(self, nums: List[int]) -> List[int]:
total_dict = {}
length = len(nums)
for i in range(length):
if nums[i] in total_dict:
total_dict[nums[i]] = total_dict.get(nums[i]) + 1
else:
total_dict[nums[i]] = 1
return [key for key, val in total_dict.items() if val > length//3]
2、摩根投票
摩根投票的本质是抵消,即不同元素的抵消。大于n/3的元素最多有两个,我们可以反过来想,如果有3个次数大于n/3的元素,那么总次数就大于n了,与事实矛盾。
遍历列表中的元素,分别用ele1,ele2代表不同的元素,如果再来一个不同的元素,则抵消;直到最后,剩下的元素即为有可能次数大于n/3的元素。
再次遍历列表,统计上述过程中剩余元素的次数,如果大于n/3,即为结果。
代码
class Solution:
def majorityElement(self, nums: List[int]) -> List[int]:
result = []
ele1,ele2 = 0,0
vote1, vote2 = 0,0
for num in nums:
if vote1>0 and num==ele1:
vote1 += 1
elif vote2>0 and num == ele2:
vote2 += 1
elif vote1 == 0:
ele1 = num
vote1 += 1
elif vote2 == 0:
ele2 = num
vote2 += 1
else:
vote1 -= 1
vote2 -= 1
total_ele1,total_ele2 = 0,0
for num in nums:
if num == ele1:
total_ele1 += 1
elif num == ele2:
total_ele2 += 1
if total_ele1 > len(nums)//3:
result.append(ele1)
if total_ele2 > len(nums)//3:
result.append(ele2)
return result
链接:https://leetcode-cn.com/problems/majority-element-ii/solution/229-qiu-zhong-shu-ii-by-senlindu-194i/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。