一道LeetCode简单题,却打消了我对Python的自以为是!

简介: Leetcode最新上线了手机版app,之前手机只能通过浏览器登录网站学习,如今有app,闲了就可以瞅两道题。今天等车的时候随手翻了一道题169. 多数元素 http://leetcode-cn.com/problems/majority-element/。看了下是众数问题,脑子简单过了下大概思路,就准备接着看其他题了。但想想还是看下别人是怎么做的吧,结果....

image.png


Leetcode最新上线了手机版app,之前手机只能通过浏览器登录网站学习,如今有app,闲了就可以瞅两道题。今天等车的时候随手翻了一道题169. 多数元素 http://leetcode-cn.com/problems/majority-element/。看了下是众数问题,脑子简单过了下大概思路,就准备接着看其他题了。但想想还是看下别人是怎么做的吧,结果....


关于题目


给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: [3,2,3]

输出: 3

示例 2:

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

输出: 2


暴力解法


先来看看最简单无脑的暴力解法,详细大多数人都能想到该解题方式:

class Solution:
    def majorityElement(self, nums):
        majority_count = len(nums)//2
        for num in nums:
            count = sum(1 for elem in nums if elem == num)
            if count > majority_count:
                return num

先计算列表1/2的长度,然后进行for循环嵌套最终获取结果。这种时间复杂度:O(n*n)的解法就不多赘述了。主要看看下面两种解法。


哈希表


这种方法,在LeetCode上很常见,就是使用Counter的方式,生成针对元素与出现次数的字典,然后进行计算。

class Solution:
    def majorityElement(self, nums):
        counts = collections.Counter(nums)
        return max(counts.keys(), key=counts.get)

本来觉得没什么特别,但当看到return操作时,觉得自己几年的Python都白学了。居然不知道max()函数,具有key的方法...一直是用它来简单的比较最大值。殊不知针对字典操作时,max可以通过定义key值来进行动态比较。(类似的方法如sorted倒是经常使用)...不知道max有key这个参数的,举个手,让我知道我不是一个人,哈哈...


奇思妙想


最让我佩服的就是下面这种解题思路,堪称经典。

文中定义有一个关键点,多数元素是指数据中出现大于n/2的元素。那么如果所有数字被单调递增或者单调递减的顺序排了序,当n是奇数时,众数的下标为n/2,当n是偶数时,下标为n/2 +1。于是出现了下面这种犀利的解法。

class Solution:
    def majorityElement(self, nums):
        nums.sort()
        return nums[len(nums)//2]

然而,官方的答案还远不止这些,一共提供了六种解答方式。所以,你觉得自己Python学到位了吗?


The End

相关文章
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
168 6
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
364 2
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
343 7
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
161 4
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
152 3
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
123 3
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
149 3
|
Python
【Leetcode刷题Python】剑指 Offer 32 - I. 从上到下打印二叉树
本文介绍了使用Python实现从上到下打印二叉树的解决方案,采用层次遍历的方法,利用队列进行节点的访问。
123 2
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
277 1
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
171 1

推荐镜像

更多