Leetcode # 169, 229 Majority Element I and II

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.

这一题可以用排序之后查看序列正中间那个元素的方法来解。但是复杂度是排序的复杂度nlog(n)。 用如下的方法借鉴Moore Voting。

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        
        major = 0
        count = 0
        
        for x in nums:
            if count == 0:
                major = x
                count = 1
            elif x == major:
                count += 1
            else:
                count -= 1
        
        return major

 

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

这一题由于对复杂度的限制是线性的,所以不能用排序。可以使用两个majority的candadite。

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        if not nums:
            return []
        n1, n2, c1, c2 = 0, 1, 0, 0 
        
        for num in nums:
            if num == n1:
                c1 += 1
            elif num == n2:
                c2 += 1
            elif c1 == 0:
                n1 = num; c1 = 1
            elif c2 == 0:
                n2 = num; c2 = 1
            else:
                c1 -= 1; c2 -= 1
        size = len(nums)
        
        return [n for n in (n1, n2) if nums.count(n) > size/3]

 

posted @ 2016-12-11 13:52  lettuan  阅读(139)  评论(0编辑  收藏  举报