# leetcode-169

2020年3月23日

### 169. 多数元素

题目

一开始的思路是遍历一遍整个列表，用一个字典去记录每个元素出现的次数，当次数大于 $\cfrac{n}{2}$ 时就可以得出结果。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    class Solution:
      def majorityElement(self, nums) -> int:
        d = {}
        l = len(nums)
        for n in nums:
          if not n in d:
            d[n] = 0
          d[n] = d[n] + 1
          if d[n] > l/2:
            return n
    # 64 ms	15.1 MB

Python 也有专门计数的库，写起来更简单一点：

    1
    2
    3
    4
    5

    class Solution:
      def majorityElement(self, nums):
        counts = collections.Counter(nums)
          return max(counts.keys(), key=counts.get)
    # 44 ms	15.1 MB

由于要找的数出现次数大于 $\cfrac{n}{2}$，脑子里掠过一下蒙特卡罗算法，后来在官方解答中也看到类似的思路了：

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    class Solution:
        def majorityElement(self, nums):
            majority_count = len(nums)//2
            while True:
                candidate = random.choice(nums)
                if sum(1 for elem in nums if elem == candidate) > majority_count:
                    return candidate

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