[LeetCode][Python]169. Majority Element

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

思路:

  1. 继续使用collections的Counter方法。
  2. 对list排序,数组长度的一半的地方就是最多元素。
  3. Boyer-Moore算法,高人的算法果然很厉害,我看了好几遍才明白。设置两个变量majority和count,都设为0.依次遍历list。如果count为0,则重选majority;如果当前数字和majority相等,count加一,否则减一。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        import collections
        if not nums:
            return 0
        if len(nums) == 1:
            return nums[0]

        return [n for n, count in collections.Counter(s).items() if count > len(nums)//2][0]

    def majorityElement2(self, nums):
        if not nums:
            return 0

        nums.sort()
        return nums[len(nums)/2]

    def majorityElement3(self, nums):
        if not nums:
            return 0
        dic = {}
        for num in nums:
            dic[num] = dic.get(num, 0) + 1
        for num in nums:
            if dic[num] > len(nums)//2:
                return num

    def majorityElement4(self, nums):
        if not nums:
            return 0

        majority = 0
        count = 0
        for num in nums:
            if count == 0:
                majority = num
            if num==majority:
                count += 1
            else:
                count -= 1
        return majority

if __name__ == '__main__':
    sol = Solution()
    s = [1, 1, 2, 1, 2, 2, 1, 2, 2]
    print sol.majorityElement(s)
    print sol.majorityElement2(s)
    print sol.majorityElement3(s)
    print sol.majorityElement4(s)

你可能感兴趣的:([LeetCode][Python]169. Majority Element)