• 【Python3】【力扣题】169. 多数元素


    【力扣题】题目描述:

    众数:一组数据中出现次数最多的数据。

    【Python3】代码:

    1、解题思路:哈希表。使用哈希映射存储各元素以及出现的次数,哈希映射中的键值对中的键为元素、值为该元素出现次数。

    知识点:collections.Counter(...):Counter对象实例化。用字典形式为各元素计数。

    (1-1)遍历哈希映射中的键值对,返回键值对中的值> \frac{n}{2}的元素。

    知识点:字典形式.items():返回可遍历的键值对(元组形式即(键,值))。

    1. class Solution:
    2. def majorityElement(self, nums: List[int]) -> int:
    3. from collections import Counter
    4. adict = Counter(nums)
    5. m = len(nums) // 2
    6. for key,val in adict.items():
    7. if val > m:
    8. return key

    (1-2)对于哈希映射中的键值对,获取值最大的那个键。

    知识点:字典形式.items():返回可遍历的所有键。

                  字典形式.get(...):通过键获取对应的值。

                  max(...):获取最大值。

    1. class Solution:
    2. def majorityElement(self, nums: List[int]) -> int:
    3. from collections import Counter
    4. adict = Counter(nums)
    5. return max(adict.keys(),key=adict.get)

    2、解题思路:排序。从小到大依次排序,出现次数> \frac{n}{2},那么中间那个数一定是众数。

    知识点:序列.sort():在原序列上按从小到大排序。

    1. class Solution:
    2. def majorityElement(self, nums: List[int]) -> int:
    3. nums.sort()
    4. return nums[len(nums) // 2]

    3、解题思路:随机抽数。出现次数> \frac{n}{2},随机抽取一个数大概率就是众数。

    知识点:random.choice(...):一组数据中随机选取一个。

                  len(序列):获取序列的长度。

                  sum(...):求和。

    1. class Solution:
    2. def majorityElement(self, nums: List[int]) -> int:
    3. import random
    4. m = len(nums) // 2
    5. while True:
    6. rand = random.choice(nums)
    7. if sum(1 for x in nums if x == rand) > m:
    8. return rand

    4、解题思路:分治算法。将一组数据递归分成左右2部分,直到子区间长度为1,再回溯合并比较左右区间值以及值的数量。最终返回数量多的那个值。

    知识点:闭包(A函数里有B函数。A函数返回值为B函数但不加括号,实际调用时才加括号),递归(B函数里调用B函数自身)。

    1. class Solution:
    2. def majorityElement(self, nums: List[int]) -> int:
    3. def recurse(low,high) -> int:
    4. # 最终分成只有一个数的数组,并返回值
    5. if low == high: return nums[low]
    6. # 从中间分成左右2部分(递归)
    7. mid = (high-low) // 2 + low
    8. left = recurse(low,mid)
    9. right = recurse(mid+1,high)
    10. # 分完后,回溯比较左右2部分值以及值的数量。
    11. # 若左右2部分的值相同,返回哪个都一样
    12. if left == right: return left
    13. # 若左右2部分的值不同,左右2部分合并比较2个值的数量,返回数量多的那个值
    14. left_count = sum(1 for i in range(low,high+1) if nums[i] == left)
    15. right_count = sum(1 for i in range(low,high+1) if nums[i] == right)
    16. return left if left_count > right_count else right
    17. return recurse(0,len(nums)-1)

    5、解题思路:Boyer-Moore投票算法。依次遍历每个元素,既然出现次数> \frac{n}{2},众数即使和其他数抵消,最终剩余的一定是众数。

    1. class Solution:
    2. def majorityElement(self, nums: List[int]) -> int:
    3. count = 0
    4. val = None
    5. for x in nums:
    6. if count == 0:
    7. val = x
    8. count += (1 if x == val else -1)
    9. return val

  • 相关阅读:
    【路径规划-TSP问题】基于遗传算法求解旅行商问题附matlab代码
    vue 使用v-cloak
    【代码随想录】Day 50 动态规划11 (买卖股票Ⅲ、Ⅳ)
    语言基础篇12——Python有哪些异常,优雅的处理异常
    TDD、BDD、ATDD都是什么、有什么区别?(上)
    使用uni-app创建扫码连接wifi小程序
    界面组件Telerik UI for WPF入门指南 - 如何使用主题切换自定义样式
    设计并实现一个并发安全的LRU(Least Recently Used,最近最少使用)缓存结构
    湖南中医药大学成考2022年下学期网络课程学习与考试工作安排
    2.18 小红书的表情文案一键生成,原来这么简单【玩赚小红书】
  • 原文地址:https://blog.csdn.net/yannan20190313/article/details/134034133