Majority Element I

https://leetcode.com/problems/majority-element/

首先题中数组中某一元素是majority(超过一半都是这个元素),请找出这个元素。

最naive的应该是 scan and count, 需要辅助空间 时间空间复杂度都是 $O(n)$

也可以排序或者quick select后,直接取中位数,时间复杂度是排序 $O(n\log n)$.

这里探讨几个经典的做法

Majority Vote

用一个计数器,迭代这个数组,当计数器为0的时候,将当前元素记为结果,然后每遇到一个相同元素,则计数器加一,反之则减一。 原理是假设不同元素可以两两相消,那么最后剩下的一定是majority element. 这种情况是1pass,如果你被告知这里一定有这样一个majority vote。否则, 你需要再加上一轮verify,其实是一个2pass, 即 2N次比较。 那么如果是这样,允许不存在majority,最好的算法是? 这里简要的介绍了这么一个算法,来自一篇很老的paper。其中证明了optimal的比较次数是 $3n/2-2$. 这个算法需要额外的空间。

 1class Solution(object):
 2    def majorityElement(self, nums):
 3        """
 4        :type nums: List[int]
 5        :rtype: int
 6        """
 7        res = 0
 8        counter = 0
 9        for x in nums:
10            if counter == 0:
11                counter +=1
12                res = x
13            else:
14                if res == x:
15                    counter +=1
16                else:
17                    counter -=1
18        return res

Majority Element II

https://leetcode.com/problems/majority-element-ii