• LeetCode(Python)—— 多数元素(简单)


    多数元素

    概述:给定一个大小为 n 数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于  [n/2] 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

    1. 输入:nums = [3,2,3]
    2. 输出:3
    3. 输入:nums = [2,2,1,1,1,2,2]
    4. 输出:2

    方法一:随机化

    思路:由于一个给定的下标对应的数字很有可能是众数,我们随机挑选一个下标,检查它是否是众数,如果是就返回,否则继续随机挑选。

    1. # 随机法(超时看运气)
    2. class Solution:
    3. def majorityElement(self, nums: List[int]) -> int:
    4. target = len(nums) // 2
    5. while True:
    6. ans = random.choice(nums)
    7. if sum(1 for i in nums if i == target) > target:
    8. return ans

    方法二:字典

    思路:我们建立一个空字典,对数组 nums 进行迭代,如果键存在,对应的值 +1

    1. # 字典
    2. class Solution:
    3. def majorityElement(self, nums: List[int]) -> int:
    4. dict_element = {}
    5. n = len(nums)
    6. for i in range(n):
    7. if nums[i] in dict_element:
    8. dict_element[nums[i]] += 1
    9. if dict_element[nums[i]] > (n / 2):
    10. return nums[i]
    11. else:
    12. dict_element[nums[i]] = 1
    13. if dict_element[nums[i]] > (n / 2):
    14. return nums[i]

    方法三:哈希表

    思路:我们用一个循环遍历数组 nums 并将数组中的每个元素加入哈希映射中。在这之后,我们遍历哈希映射中的所有键值对,返回值最大的键。我们同样也可以在遍历数组 nums 时候使用打擂台的方法,维护最大的值,这样省去了最后对哈希映射的遍历。

    1. # 哈希表
    2. class Solution:
    3. def majorityElement(self, nums: List[int]) -> int:
    4. counts = collections.Counter(nums)
    5. return max(counts.keys(), key = counts.get)

    方法四:排序

    思路:如果将数组 nums 中的所有元素按照单调递增或单调递减的顺序排序,那么下标为 (n/2) 的元素(下标从 0 开始)一定是众数。

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

    方法五:分治

    思路:我们使用经典的分治算法递归求解,直到所有的子问题都是长度为 1 的数组。长度为 1 的子数组中唯一的数显然是众数,直接返回即可。如果回溯后某区间的长度大于 1,我们必须将左右子区间的值合并。如果它们的众数相同,那么显然这一段区间的众数是它们相同的值。否则,我们需要比较两个众数在整个区间内出现的次数来决定该区间的众数。

    1. # 分治
    2. class Solution:
    3. def majorityElement(self, nums: List[int]) -> int:
    4. def majority_element_rec(lo, hi):
    5. if lo == hi:
    6. return nums[lo]
    7. mid = (hi - lo) // 2 + lo
    8. left = majority_element_rec(lo, mid)
    9. right = majority_element_rec(mid + 1, hi)
    10. if left == right:
    11. return left
    12. left_count = sum(1 for i in range(lo, hi + 1) if nums[i] == left)
    13. right_count = sum(1 for i in range(lo, hi + 1) if nums[i] == right)
    14. return left if left_count > right_count else right
    15. return majority_element_rec(0, len(nums) - 1)

    方法六:Boyer-Moore 投票算法

    思路:如果我们把众数记为 +1,把其他数记为 −1,将它们全部加起来,显然和大于 0,从结果本身我们可以看出众数比其他数多。

    1. # Boyer-Moore 投票算法
    2. class Solution:
    3. def majorityElement(self, nums: List[int]) -> int:
    4. count = 0
    5. ans = None
    6. for i in nums:
    7. if count == 0:
    8. ans = i
    9. if i == ans:
    10. count += 1
    11. else:
    12. count -= 1
    13. return ans

    总结

    投票算法好有灵性???

  • 相关阅读:
    java计算机毕业设计高校图书馆管理网站源码+mysql数据库+系统+lw文档+部署
    关于设置MySQL中create_time和update_time默认值和实时更新
    爬虫入门篇
    一图读懂腾讯云EdgeOne Open Edge平台
    推荐算法学习笔记2.2:基于深度学习的推荐算法-基于特征交叉组合+逻辑回归思路的深度推荐算法-Deep Crossing模型
    vim批量多行缩进调整
    从零实现深度学习框架——LSTM从理论到实战【实战】
    WebSocket真实项目总结
    丝绸之路网络安全论坛成功举办,开源网安受邀分享软件供应链安全落地经验
    2000-2021年各省GDP包括名义GDP、实际GDP、GDP平减指数(以2000年为基期)
  • 原文地址:https://blog.csdn.net/m0_61661179/article/details/127556501