iT邦幫忙

0

leetcode with python:169. Majority Element

  • 分享至 

  • xImage
  •  

題目:

Given an array nums of size n, return the majority element.

The majority element is the element that appears more than (n / 2) times. You may assume that the majority element always exists in the array.

給定一個長度為n的陣列,返回它的majority element(出現>n/2次的值)

最初想法就是建立一個dictionary紀錄各數出現的次數
最後看哪個數出現了n/2次以上即為majority element

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        d={}
        for i in nums:
            if i in d:
                d[i]=d[i]+1
            else:
                d[i]=1
        for i in d:
            if d[i]>len(nums)/2:
                return i

最後執行時間185ms(faster than 81.70%)

不過一個一個計數實在有點慢
後來我想到既然確定majority element會出現n/2次以上
那在陣列為排序陣列的狀況下,中間必然為majority element
於是有了以下簡短的程式碼

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        nums.sort()
        return nums[len(nums)//2]

最後執行時間159ms(faster than 99.16%)

看了討論區才發現題目其實是要用博耶-摩爾多數投票算法(Boyer–Moore majority vote algorithm)
該演算法概念是紀錄陣列第一位並從其開始遍歷,且設立計數器
若遇到和紀錄值一樣的值計數器+1,不一樣的值計數器-1
當計數器為0時,紀錄值轉為此時遇到的新值
若有個元素佔了陣列一半以上,最後的紀錄值便是該元素
總之就是讓各不同元素相互抵消最後只留下majority element
在這題實作如下

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        ans=0
        cnt=0
        for i in nums:
            if cnt==0:
                ans=i
            if ans==i:
                cnt=cnt+1
            else:
                cnt=cnt-1
        return ans

最後執行時間165ms(faster than 97.56%)

本題學習到的重點:博耶-摩爾多數投票算法(Boyer–Moore majority vote algorithm)
那我們下題見


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言