博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(python版)《剑指Offer》JZ28:数组中出现次数超过一半的数字
阅读量:4089 次
发布时间:2019-05-25

本文共 2034 字,大约阅读时间需要 6 分钟。

在这里插入图片描述

【思路1】排序,取中间元素

时间复杂度为O(nlogn)

class Solution:    def majorityElement(self, nums: List[int]) -> int:        if not nums:            return None        nums.sort()        return nums[int(len(nums)/2)]'''作者:xiao-xue-66链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/pythonti-jie-kuai-pai-zi-dian-di-xiao-by-xiao-xue-/来源:力扣(LeetCode)'''

【思路2】摩尔投票法

核心理念为 票数正负抵消 。此方法时间和空间复杂度分别为 O(N)和 O(1) 。

推论: 若记 众数 的票数为 +1 ,非众数 的票数为 −1 ,则一定有所有数字的 票数和 > 0

在这里插入图片描述
在这里插入图片描述

class Solution:    def majorityElement(self, nums: List[int]) -> int:        votes = 0        for num in nums:            if votes == 0: x = num            votes += 1 if num == x else -1        return x'''作者:jyd链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/mian-shi-ti-39-shu-zu-zhong-chu-xian-ci-shu-chao-3/来源:力扣(LeetCode)'''

扩展】由于题目说明 给定的数组总是存在多数元素 ,因此本题不用考虑 数组不存在众数 的情况若考虑,需要加入一个 “验证环节” ,遍历数组 nums 统计 x 的数量

  • 若 x 的数量超过数组长度一半,则返回 x ;
  • 否则,返回未找到众数;

时间和空间复杂度不变,仍为 O(N)和 O(1)。

class Solution:    def majorityElement(self, nums: List[int]) -> int:        votes, count = 0, 0        for num in nums:            if votes == 0: x = num            votes += 1 if num == x else -1        # 验证 x 是否为众数        for num in nums:            if num == x: count += 1        return x if count > len(nums) // 2 else 0 # 当无众数时返回 0'''作者:jyd链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/mian-shi-ti-39-shu-zu-zhong-chu-xian-ci-shu-chao-3/来源:力扣(LeetCode)'''

【思路3】哈希表

我们统计每个数字出现的次数,并保存在哈希表中。遍历哈希表,如果找到符合要求的数字,直接返回即可。

时间复杂度:O(N)。

空间复杂度:O(N),使用了哈希表。

class Solution:    def majorityElement(self, nums: List[int]) -> int:        dic = collections.Counter(nums)        for key,value in dic.items():            if value > len(nums) / 2:                return key'''作者:z1m链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/ha-xi-biao-jie-fa-by-ml-zimingmeng/来源:力扣(LeetCode)'''

Counter(计数器):用于追踪值的出现次数

在这里插入图片描述

转载地址:http://gyjii.baihongyu.com/

你可能感兴趣的文章
springBoot(5)---整合servlet、Filter、Listener
查看>>
C++ 模板类型参数
查看>>
C++ 非类型模版参数
查看>>
设计模式 依赖倒转原则 & 里氏代换原则
查看>>
DirectX11 光照
查看>>
图形学 图形渲染管线
查看>>
DirectX11 计时和动画
查看>>
DirectX11 光照与材质的相互作用
查看>>
DirectX11 法线向量
查看>>
DirectX11 兰伯特余弦定理(Lambert)
查看>>
DirectX11 漫反射光
查看>>
DirectX11 环境光
查看>>
DirectX11 镜面光
查看>>
DirectX11 三种光照组成对比
查看>>
DirectX11 指定材质
查看>>
DirectX11 平行光
查看>>
DirectX11 点光
查看>>
DirectX11 聚光灯
查看>>
DirectX11 HLSL打包(packing)格式和“pad”变量的必要性
查看>>
DirectX11 光照演示示例Demo
查看>>