题目:(多数元素)给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:[3,2,3] 输出:3
示例 2:输入:[2,2,1,1,1,2,2] 输出:2
程序说明:
1、方法一:用哈希映射(HashMap)来存储每个元素和其出现的次数。键表示一个元素,键值表示该元素出现的次数。运用循环遍历数组 nums 并将数组中的每个元素加入哈希映射中。在这之后,我们遍历哈希映射中的所有键值对,返回值最大的键(也就是出现次数最多的)。
代码中运用了collections.Counter方法将列表中的元素及其出现次数转换为字典键值对的形式,接着用max方法选出出现最多次数的元素
2、方法二是根据数学众数的知识解答的
3、方法三首先是随机选出列表中的一个数,然后通过for循环遍历列表中的数,将与所选出的数相等的数选出,记一次 1,再用sum将每次得到的 1 相加,最后将其与n/2比较,即可得出结果
全部代码:
方法一:哈希法
class Solution:
def majorityElement(self, nums: List[int]) -> int:
counts = collections.Counter(nums)
return max(counts.keys(), key=counts.get)
方法二:众数知识
class Solution:
def majorityElement(self, nums: List[int]) -> int:
nums.sort()
return nums[len(nums) // 2]
方法三:随机化
class Solution:
def majorityElement(self, nums: List[int]) -> int:
majority_count = len(nums) // 2
while True:
candidate = random.choice(nums)
if sum(1 for elem in nums if elem == candidate) > majority_count:
return candidate
方法四:Boyer-Moore 投票算法
class Solution:
def majorityElement(self, nums: List[int]) -> int:
count = 0
candidate = None
for num in nums:
if count == 0:
candidate = num
count += (1 if num == candidate else -1)
return candidate
题目来源:力扣(leetcode)