前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【LeetCode14】求众数

【LeetCode14】求众数

作者头像
Sam Gor
发布2019-07-15 17:00:05
8600
发布2019-07-15 17:00:05
举报
文章被收录于专栏:SAMshare
【LeetCode01】找到字符串中最长的回文字串

【LeetCode02】找出不含重复字符的 最长子串 的长度

【LeetCode03】查找字符串最长公共前缀

【LeetCode04】最接近的三数之和

【LeetCode05】删除排序数组中的重复项

【LeetCode06】反转字符串中的单词

【LeetCode07】旋转矩阵(一)

【LeetCode08】字符串转换整数

【LeetCode09】有效的括号

【LeetCode10】盛最多水的容器

【LeetCode11】反转字符串

【LeetCode12】合并两个有序数组

【LeetCode13】整数反转

? 今日挑战

给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在众数。

示例 1:

输入: [3,2,3]输出: 3

示例 2:

输入: [2,2,1,1,1,2,2]输出: 2

先思考一下,后面我会给出一个解题思路~?

Way 1

第一种方法最直接,直接使用Python的库collections里的方法Counter,直接统计所有元素出现的次数,返回最大次数的元素即可。

Python实现:

代码语言:javascript
复制
def majorityElement(nums):
    counts = collections.Counter(nums)
    print(counts)
    return max(counts.keys(), key=counts.get)

Way 2

第二种方法这里介绍一下Boyer-Moore 投票算法。

1 )因为题目中对于众数的定义为出现次数大于 ⌊ n/2 ⌋ 的元素 ,因此我们把众数记为 +1,把其他数记为 -1,将它们全部加起来,显然和大于 0 。

2 )这里,我们把第一次出现的数字,当做为当前的候选者,循环迭代,如果出现不一样的数字,投票器减1,出现相同的数字,投票器加1,如果投票器为0,重新挑选当前位置的数字作为新的候选者,从当前的位置开始,继续迭代。

可以看下面的例子:

[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7]

首先,下标为 0 的 7 被当做众数的第一个候选。在下标为 5 处,计数器会变回0 。所以下标为 6 的 5 是下一个众数的候选者。由于这个例子中 7 是真正的众数,所以通过忽略掉前面的数字,我们忽略掉了同样多数目的众数和非众数。因此, 7 仍然是剩下数字中的众数。

[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 5, 5, 5, 5]

现在,众数是 5 (在计数器归零的时候我们把候选从 7 变成了 5)。此时,我们的候选者并不是真正的众数,但是我们在 遗忘 前面的数字的时候,要去掉相同数目的众数和非众数(如果遗忘更多的非众数,会导致计数器变成负数)。

因此,上面的过程说明了我们可以放心地遗忘前面的数字,并继续求解剩下数字中的众数。最后,总有一个后缀满足计数器是大于 0 的,此时这个后缀的众数就是整个数组的众数。

Python实现:

代码语言:javascript
复制
def Moore(nums):
    count=0
    target=None
    for i in range(len(nums)):
        print(i)
        print(target)
        if target==None or count==0: 
            target=nums[i]
            count+=1
        else:
            if target == nums[i]: count+=1
            else: count-=1
    return target
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SAMshare 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【LeetCode02】找出不含重复字符的 最长子串 的长度
  • 【LeetCode04】最接近的三数之和
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档