官方解法中有乙個值得學習的投票法
方法 6:boyer-moore 投票演算法
想法如果我們把眾數記為 +1+1 ,把其他數記為 -1−1 ,將它們全部加起來,顯然和大於 0 ,從結果本身我們可以看出眾數比其他數多。
演算法本質上, boyer-moore 演算法就是找 nums 的乙個字尾 sufsuf ,其中 suf[0]suf[0] 就是字尾中的眾數。我們維護乙個計數器,如果遇到乙個我們目前的候選眾數,就將計數器加一,否則減一。只要計數器等於 0 ,我們就將 nums 中之前訪問的數字全部 忘記 ,並把下乙個數字當做候選的眾數。直觀上這個演算法不是特別明顯為何是對的,我們先看下面這個例子(豎線用來劃分每次計數器歸零的情況)
[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 7, 7, 7, 7]
首先,下標為 0 的 7 被當做眾數的第乙個候選。在下標為 5 處,計數器會變回0 。所以下標為 6 的 5 是下乙個眾數的候選者。由於這個例子中 7 是真正的眾數,所以通過忽略掉前面的數字,我們忽略掉了同樣多數目的眾數和非眾數。因此, 7 仍然是剩下數字中的眾數。(因為題目就是這樣明確這個眾數 數量》 n/2 的)
[7, 7, 5, 7, 5, 1 | 5, 7 | 5, 5, 7, 7 | 5, 5, 5, 5]
現在,眾數是 5 (在計數器歸零的時候我們把候選從 7 變成了 5)。此時,我們的候選者並不是真正的眾數,但是我們在 遺忘 前面的數字的時候,要去掉相同數目的眾數和非眾數(如果遺忘更多的非眾數,會導致計數器變成負數)。
因此,上面的過程說明了我們可以放心地遺忘前面的數字,並繼續求解剩下數字中的眾數。最後,總有乙個字尾滿足計數器是大於 0 的,此時這個字尾的眾數就是整個陣列的眾數。
作為補充: 我覺得這個投票法 是 適用於 眾數 > n/2 的這個情況下的 並不適合 我們理解的重複數字最多的那個即為眾數
明顯後者包括前者
力扣169 多數元素
給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數大於 n 2 的元素。可以假設陣列不為空,並且一定存在多數元素 示例 示例 1 輸入 3,2,3 輸出 3 示例 2 輸入 2,2,1,1,1,2,2 輸出 2 解題思路 如果乙個陣列中有有乙個數大於陣列元素的一半,那麼那這個...
多數元素(力扣169題)
題目 給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。分析 1 多數元素即在一組數 現次數大於 n 2 的元素 2 多數元素在這個陣列中一定存在 這兩個條件就決定了這種多數元素一定只可能是一種數,...
力扣169題 多數元素
leetcode刷題筆記 給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數 大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。示例1輸入 3,2,3 輸出 3 示例2輸入 2,2,1,1,1,2,2 輸出 2 題目上說給定的陣列總是存在多數元素,...