169.衆数を求める(Python)

2037 ワード

タイトル
難易度:★☆☆☆☆タイプ:数学
nの大きさの配列を与え,その中の衆数を見つけた.衆数とは,配列に現れる回数がn/2⌋より大きい要素を指す.
配列は空ではなく、与えられた配列は常に衆数が存在すると仮定することができます.

例1:入力:[3,2,3]出力:3
例2:入力:[2,2,1,1,2,2]出力:2
に答える
シナリオ1:辞書(ハッシュ表)
出現回数が最も多い数を見つけるために、最も簡単な論理は、毎回の数が現れる回数を統計し、その中で最も出現回数が多い数を取り出すことです.この方法は簡単ですが、メモリのオーバーヘッドが大きいです.
class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        count = {}
        for num in nums:                                                #            
            if num in count:
                count[num] += 1
            else:
                count[num] = 1
        return {v: k for k, v in count.items()}[max(count.values())]    #       ,           

シナリオ2:数値統計
この問題で求められる衆数の定義は従来の概念とは異なり,ここで衆数の出現回数は配列中の他のすべての要素よりも多く,この原理に基づいて結果変数(res)を配列の最初の数に初期化し,統計変数(count)を用意し,この変数が結果と同じ数に遭遇すると1を加算し,そうでないと1を減算する.ゼロに減算すると、交換結果変数は次の数になります.衆数の出現回数が他の文字より多いため、配列遍歴が終了すると統計変数は必ずゼロより大きくなり、この場合、結果変数の数が衆数になります.
class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        count, res = 0, nums[0]         #          
        for i in range(len(nums)-1):    #          
            if nums[i] == res:          #              
                count += 1              #    +1
            else:                       #   
                count -= 1              #    -1
                if count == 0:          #      0
                    res = nums[i+1]     #              
        return res                      #     

シナリオ3:ソート
ここで衆数の出現回数は他の要素を上回っているので,データを並べ替えた後,真ん中の数字は必ず衆数である.
class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """

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

質問やアドバイスがあれば、コメントエリアへようこそ~