美文网首页Python
python-LeetCode-求众数

python-LeetCode-求众数

作者: DKider | 来源:发表于2019-03-19 21:50 被阅读13次

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

    示例 1:
    输入: [3,2,3]
    输出: 3
    示例 2:
    输入: [2,2,1,1,1,2,2]
    输出: 2


    众数——众数(Mode)是统计学名词,在统计分布上具有明显集中趋势点的数值,代表数据的一般水平(众数可以不存在或多于一个)。 修正定义:是一组数据中出现次数最多的数值,叫众数,有时众数在一组数中有好几个。用 M 表示。 理性理解:简单的说,就是一组数据中占比例最多的那个数。
    (来自百度)

    我的解法:利用字典,计算每一个数字出现的次数,出现次数最大的那个就是要求的众数,但是根据题目,次数还要大于列表长度的一半,所以有了下面的方法:

    class Solution(object):
        def majorityElement(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            dict={x:0 for x in nums}
            for x in nums:
                dict[x]+=1
            for x in dict.key():
                if dict[x]>len(nums)//2:
                    return x
    

    这种方法我借鉴了昨天的字典法,利用字典来计数。利用了额外字典空间,遍历列表一次,字典一次。

    当然,昨天的count法也能完成,这题虽然没有明确要求,但是我们总是要利用更小的时空复杂度来完成算法。

    还有一种方法,我是没想到,我发现大学上久了,那种投机取巧的本事丢了,思维有些不太灵活了,可能是不太动脑子了吧。。
    这种方法利用了这样的方法,将给的列表排序,因为众数的数量超过一半,所以排序后,中间的数一定是那个众数。只能说我的脑子不行。

    class Solution(object):
        def majorityElement(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            nums.sort()
            return nums[len(nums)//2]
    

    还有一个我刚学会的方法——摩尔投票法
    我借鉴了网上的解释:摩尔投票法的基本思想很简单,在每一轮投票过程中,从数组中找出一对不同的元素,将其从数组中删除。这样不断的删除直到无法再进行投票,如果数组为空,则没有任何元素出现的次数超过该数组长度的一半。如果只存在一种元素,那么这个元素则可能为目标元素。
    https://www.jianshu.com/p/c19bb428f57a
    文章写的Java实现

    但是我们不能真的去每次删除两个不相同的值,当然如果你要写也能写出来,这有个更好的方法:
    从第一个数开始count=1,遇到相同的就加1,遇到不同的就减1,减到0就重新换个数开始计数,总能找到最多的那个。——YourBaymax
    现在我们来用python来实现它:

    class Solution(object):
        def majorityElement(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            count=0
            now=None
            max=len(nums)/2
            for i in nums:
                if count==0:
                    now=i
                    count=1
                elif count>max:
                    return now
                elif i==now:
                    count+=1
                else:
                    count-=1
            return now
    

    这种方法是最快的,而且,只用了常数个空间来保存计数和待选众数。
    厉害!!这种方法我看了挺久的,脑子不行了。

    相关文章

      网友评论

        本文标题:python-LeetCode-求众数

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