题意:Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.
思路:就用字典当做哈希表就可以解了,这里注意collections.defaultdict(int),其中的int表示用int()来初始化keys中没有的值,方便使用。
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
import collections
dct, ans = collections.defaultdict(int), []
for i in nums:
dct[i] += 1
for k,v in dct.items():
if v > len(nums)/3:
ans.append(k)
return ans
这个方法是discuss里的,使用Boyer-Moore Majority Vote algorithm,这次使用两个变量candidate1,candidate2来分别表示两个可能的结果,这里挺有意思的是if和elif的使用,使这两个变量能分别表示两个数。
class Solution:
# @param {integer[]} nums
# @return {integer[]}
def majorityElement(self, nums):
if not nums:
return []
count1, count2, candidate1, candidate2 = 0, 0, 0, 1
for n in nums:
if n == candidate1:
count1 += 1
elif n == candidate2:
count2 += 1
elif count1 == 0:
candidate1, count1 = n, 1
elif count2 == 0:
candidate2, count2 = n, 1
else:
count1, count2 = count1 - 1, count2 - 1
return [n for n in (candidate1, candidate2)
if nums.count(n) > len(nums) // 3]