參考資料:
絕對眾數:在序列出現次數 >⌊n
2⌋
> \left\lfloor\dfrac n 2\right\rfloor
>⌊2
n⌋ 的數。
採用兩兩抵消的思想。因為其它所有數出現加起來都不如絕對眾數多,所以兩兩抵消後,只有最後剩下的可能是區間眾數。時間複雜度 o(n
)o(n)
o(n)
,空間複雜度 o(1
)o(1)
o(1)
。序列 [1,
n]
[1,n]
[1,n
],兩種操作:
區間染色
求區間出現次數大於等於 ⌈p(
r−l+
1)
100⌉
\left\lceil \dfrac \right\rceil
⌈100p(
r−l+
1)⌉
的數的個數。(稍有變化)
資料保證 ⌊
100p⌋≤
5\left\lfloor \dfrac p \right\rfloor \le 5
⌊p100
⌋≤5。
參考摩爾投票法的思想,記錄 ⌊
100p
⌋\left\lfloor \dfrac p \right\rfloor
⌊p100
⌋ 個互不相同的數,每次加入乙個數後,若在記錄的數中已存在,則該數次數加一;否則,將這個數連同每個數(一共 ⌊
100p⌋+
1\left\lfloor \dfrac p \right\rfloor+1
⌊p100
⌋+1)個數一起抵消。那麼,合法的數一定會到這個序列中來。
這樣想象一下:每個不同的數為一座塔,塔的高度為它的出現次數。每次可以削若干座塔的底部,則超過這個限度的塔一定削不完(反證一下,要是它削完了就沒數剩下了)。
leetcode筆記 1 17 摩爾投票,
陣列中佔比超過一半的元素稱之為主要元素。給定乙個整數陣列,找到它的主要元素。若沒有,返回 1。示例 1 輸入 1,2,5,9,5,9,5,5,5 輸出 5 示例 2 輸入 3,2 輸出 1 示例 3 輸入 2,2,1,1,1,2,2 輸出 2 說明 你有辦法在時間複雜度為 o n 空間複雜度為 o ...
摩爾投票法
刷leetcode看到的一種解法。想法其實很簡單。上網上看了下這種解法叫摩爾投票法。其實就是找array裡的眾數,原理也很簡單,例如你要找2 n多的數你找眾數,那他個數肯定不小於2 n,然後你加加減減 最後留下那個肯定是眾數。3 n 什麼的情況也一樣,畫一畫就明白了。然後這是別人的解析 摩爾投票法 ...
摩爾投票演算法
在它最簡單的形式就是,查詢最多的元素,也就是在輸入中重複出現超過一半以上 n 2 的元素。如果序列中沒有最多的元素,演算法不能檢測到正確結果,將輸出其中的乙個元素之一。當元素重複的次數比較小的時候,對於流演算法不能在小於線性空間的情況下查詢頻率最高的元素。假設這個陣列中共有n個元素,我們可以把數值不...