數(shù)組中出現(xiàn)次數(shù)超過(guò)一半的數(shù)字

數(shù)組中有一個(gè)數(shù)字出現(xiàn)的次數(shù)超過(guò)數(shù)組長(zhǎng)度的一半,請(qǐng)找出這個(gè)數(shù)字。
你可以假設(shè)數(shù)組是非空的,并且給定的數(shù)組總是存在多數(shù)元素。
示例 1:

輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
輸出: 2
限制: 1 <= 數(shù)組長(zhǎng)度 <= 50000

來(lái)源:劍指Offer 面試題39
相關(guān)企業(yè):

公司 出現(xiàn)時(shí)間
字節(jié)跳動(dòng) 2020.06

解法:摩爾投票
時(shí)間復(fù)雜度:O(n)
空間復(fù)雜度:O(1)
思路:

  • 票數(shù)和: 由于眾數(shù)出現(xiàn)的次數(shù)超過(guò)數(shù)組長(zhǎng)度的一半;若記眾數(shù)的票數(shù)為 +1 ,非眾數(shù)的票數(shù)為 ?1 ,則一定有所有數(shù)字的票數(shù)和 >0 。
  • 票數(shù)正負(fù)抵消: 設(shè)數(shù)組 nums 中的眾數(shù)為 x ,數(shù)組長(zhǎng)度為 n 。若nums的前a個(gè)數(shù)字的票數(shù)和 =0 ,則數(shù)組后(n?a)個(gè)數(shù)字的票數(shù)和一定仍>0 (即后 (n?a) 個(gè)數(shù)字的 眾數(shù)仍為 x )。

代碼:

def majorityElement(self, nums: List[int]) -> int:
        votes = 0
        for x in nums:
            if votes == 0: num = x
            votes += 1 if x == num else -1
        return num
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容