LeetCode筆記整理1 摩爾投票法
阿新 • • 發佈:2020-09-14
摩爾投票法
主要用途
求眾數
時間複雜度O(N), 空間複雜度O(1)
演算法思想
每次從序列裡選擇兩個不相同的數字刪除掉(或稱為“抵消”),最後剩下一個數字或幾個相同的數字,就是出現次數大於總數一半的那個。
有趣的
核心就是對拼消耗。玩一個諸侯爭霸的遊戲,假設你方人口超過總人口一半以上,並且能保證每個人口出去幹仗都能一對一同歸於盡。最後還有人活下來的國家就是勝利。那就大混戰唄,最差所有人都聯合起來對付你(對應你每次選擇作為計數器的數都是眾數),或者其他國家也會相互攻擊(會選擇其他數作為計數器的數),但是隻要你們不要內鬥,最後肯定你贏。最後能剩下的必定是自己人
實現
2個變數:
e: 眾數候選人
count: 計數器, count <= 0, e即將失去候選資格
主體:
遍歷整個陣列,
- 如果 count = 0, 更換候選人,
- 如果e和當前數字相同count++
- 以上都不成立 count--
最後
- 如果 count > 0, e即為眾數,
- 否則沒有眾數 返回-1
程式碼
var majorityElement = function(nums) { var e = -1; var count = 0; for(var n of nums){ if(count === 0){ e = n; ++count } else if(n === e){ ++count } else { --count } } if(count > 0) return e; else return -1; };