美文网首页
leetcode每日一题 python解法 3月13日

leetcode每日一题 python解法 3月13日

作者: Never肥宅 | 来源:发表于2020-03-13 00:27 被阅读0次

难度:简单

题目内容:

给定一个大小为n的数组,找到其中的多数元素,就是出现次数大于等于n/2的数。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2

题解:

哈希表直接存
python更简单了,直接用字典

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        d = dict()
        for i in nums:
            try:
                d[i] += 1
            except:
                d[i] = 1
        return max(d.keys(), key=d.get)
image.png

不过这样未免太简单了,起不到学习的作用
在官方的题解中看到一种解法:Boyer-Moore 投票算法 感觉很有意思,试试看
代码是这样的

class Solution:
    def majorityElement(self, nums):
        count = 0
        candidate = None

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

        return candidate

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

代码上可以看出来他的方法就是逐个改变众数candidate,如果说众数大于总数的一半的话,那就说明即使其他的数全加起来也不会比众数多,也就是不会让count大于0。
那么这样先设一个数为众数,遇到和他不一样的就-1,一样的就+1,当count归零的时候就更换新众数,那么最后一定是最多的众数成功的夺取了candidate
有兴趣可以看看leetcode的详解或者去搜搜更多的东西。

相关文章

网友评论

      本文标题:leetcode每日一题 python解法 3月13日

      本文链接:https://www.haomeiwen.com/subject/ehmnjhtx.html