• 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

    总结

    投票算法好有灵性???

  • 相关阅读:
    Grpc简介
    使用pycharm+opencv进行视频抽帧(可以用来扩充数据集)+ labelimg的使用(数据标准)
    Nacos源码本地启动爬坑记录
    解决yolov5第6版预测图中文显示问题
    git使用(上传自己的项目到github上)
    组播分片报文重组后丢包问题
    计算机网络
    hive函数总结
    如何做好商品的库存管理?哪些指标是衡量库存的指标
    practical on mifare
  • 原文地址:https://blog.csdn.net/m0_61661179/article/details/127556501