加拿大MLE面试算法题攻略:LeetCode 169 (Majority Element) Python解法

加拿大MLE面试算法题攻略:LeetCode 169 (Majority Element) Python解法 :rocket:

大家好!最近在准备加拿大Machine Learning Engineer的面试,刷到一道经典题目——LeetCode 169 Majority Element,今天分享一下我的Python解法,希望能帮到也在备战面试的小伙伴们!:light_bulb:

题目描述

给定一个大小为 n 的数组,找到其中的多数元素(出现次数超过 ⌊n/2⌋ 的元素)。假设数组非空,且多数元素一定存在。

示例:

Input: 
Output: 3

解法1:哈希表统计法(Brute Force)

最直观的方法是统计每个元素的出现次数,然后返回出现次数最多的那个。

from collections import defaultdict

def majorityElement(nums):
    counts = defaultdict(int)
    for num in nums:
        counts += 1
        if counts > len(nums) // 2:
            return num

时间复杂度: O(n)
空间复杂度: O(n)

解法2:排序法(Optimal for Short Code)

由于多数元素超过一半,排序后中间位置一定是它!

def majorityElement(nums):
    nums.sort()
    return nums

时间复杂度: O(n log n)(取决于排序算法)
空间复杂度: O(1)(如果原地排序)

解法3:Boyer-Moore投票算法(Optimal for O(1) Space)

这是最优解法,只需要O(1)空间,遍历一次数组即可!

def majorityElement(nums):
    count = 0
    candidate = None
    
    for num in nums:
        if count == 0:
            candidate = num
        count += (1 if num == candidate else -1)
    
    return candidate

时间复杂度: O(n)
空间复杂度: O(1) :bullseye:

总结

  • 哈希表法:通用性强,适合统计类问题。
  • 排序法:代码简洁,但时间稍差。
  • Boyer-Moore算法:最优解,适合面试秀操作!:fire:

大家面试遇到过这道题吗?欢迎分享你的解法或优化思路!:speech_balloon: 祝大家Offer多多!:four_leaf_clover:

冲鸭!加拿大MLE面试算法题,Boyer-Moore算法yyds!O(1)空间复杂度简直绝了:fire: :canada:

回复:
哇塞!这篇攻略太实用辣!:canada:多伦多MLE求职狗狂喜ing~ :laptop: 刚好在刷LC169,Boyer-Moore算法简直yyds!面试官上次还问“如果不用extra space怎么破”,直接掏出这个解法当场拿捏:ok_hand:

补充个冷知识:这题在加拿大大厂(比如Shopify/AMD)常考变形版:red_exclamation_mark:比如

  • Follow-up:如果不确定是否存在多数元素(即可能没有n/2+的情况),最后要再扫一遍验证count>0哦!

个人觉得哈希表法虽然土但稳如老狗:dog_face:,适合白板coding手抖时保命(别问我怎么知道的…)

PS:最近用**加拿大本土IDE(像PyCharm Edu版)**跑这些解法,发现排序法在小数据集反而更快:tornado: 可能和本地优化有关?

蹲一个TikTok加拿大考过这题的小伙伴~ :maple_leaf: #算法面试不头秃 #LeetCode169通关

加拿大MLE面试攻略: Majority Element解法 :rocket:
哈希表统计法 :bar_chart:
排序法 :chart_increasing:
Boyer-Moore投票算法 :bullseye:
祝面试顺利! :speech_balloon::four_leaf_clover:

Boyer-Moore稳!:fire:

Tenor

200

“难道Boyer-Moore算法不是:canada:科技大厂的最爱吗?省空间又高效,连多伦多地铁早高峰的吞吐量都能类比!:metro: #算法面试干货