【演算法】已知必存在眾數,求該眾數 -- Boyer-Moore 投票演算法
- LeetCode的思路演繹
- 演算法思路
題意:必存在眾數 -》 在一個陣列中,有一個數擁有找過一半的佔有率,這個數記為A
若A和其他陣列中的數進行選舉,投票人只能是陣列中的數。則A必贏(因為人數上已經過半)。
解題的關鍵就是:找到票數最高的人。
- 改動LeetCoded的演繹
/**
* @Author james
* @Date 2019/7/10
* @Description 求陣列中的眾數 - Boyer-Moore投票法
*/
public class Solution3 {
public int majorityElement(int[] nums) {
// 陣列第一個數就是候選人,肯定給自己投票,票數為1
int ret = nums[0];
int power = 1;
// 只有一個人,票數投給自己,直接成為眾數
if (nums.length == 1) {
return ret;
}
/*
從第一個數後面開始投票,表決前一個數是否應該成為候選人。
數值相等票數 +1 數值不等票數-1, 即不認為上一個人應該成為候選人。
將上一個候選人的票數清零,自己可以成為候選人,擁有獲得多一票的權利。
遍歷的過程中,數A必然成為候選人,而且任由除A數外所有人反對,票數到最後一定是正數。
正數不清零,到最後則為最終候選人。
*/
for (int i = 1; i < nums.length; i++) {
if (nums[i] == ret)
power++;
else
power--;
// 新晉候選人
if(power == 0){
ret = nums[i];
power = 1;
}
}
return ret;
}
}
- 複雜度
需要遍歷陣列的所有元素,時間複雜度為O(n)
沒有隨著資料量增大而變多的變數,空間複雜度為O(1)
是本題的最佳解法
相關文章
- 優化的求眾數方法 - 摩爾投票演算法(演算法思想+求眾數的三種方法+摩爾投票演算法改進版求眾數 II)優化演算法
- 演算法題:求眾數演算法
- 【演算法】求眾數-js解法演算法JS
- 演算法:Majority Element(求眾數)演算法
- 【演算法解題報告】求眾數演算法
- 找眾數演算法演算法
- 演算法面試題彙總_2求眾數演算法面試題
- 求眾數、排序演算法、二分法排序演算法
- 分治演算法-眾數問題演算法
- 【演算法練習】(8)眾數演算法
- 演算法之絕對眾數演算法
- 【leetcode】求眾數LeetCode
- 求取眾數及重數的演算法實現(Java)演算法Java
- 演算法設計--眾數和重數問題(分治法)演算法
- c++實現求眾數及其重數C++
- 【20190326】【每天一道演算法題】求眾數(分治演算法)演算法
- Leetcode刷題——求眾數LeetCode
- 【LeetCode】求眾數(四種方法)LeetCode
- 求素數(質數)演算法演算法
- (七)一個尋找陣列中眾數的演算法陣列演算法
- LeetCode169求眾數——分治LeetCode
- 微信公眾號投票活動製作教程 微信公眾號投票怎麼弄?
- 演算法金 | 平均數、眾數、中位數、極差、方差,標準差、頻數、頻率 一“統”江湖演算法
- 分治法求眾數和重數(含檔案輸入輸出)
- ACM 眾數問題ACM
- 眾數問題分析
- 每日一道演算法題--leetcode 169--求眾數--python--兩種方法演算法LeetCodePython
- LeetCode每日一題:求眾數(No.169)LeetCode每日一題
- Leetcode 169:求眾數(最詳細的解法!!!)LeetCode
- 區間眾數(分塊)
- 求自然數的組合數的回溯演算法演算法
- java演算法 求最大公約數Java演算法
- [資料結構與演算法]15 兩行程式碼就可以搞定求眾數,但還有更巧的資料結構演算法行程
- 公眾號如何釋出一個投票活動
- 字串匹配的Boyer-Moore演算法字串匹配演算法
- 求最大公公約數(最大公因數)—— 歐幾里得演算法演算法
- LeetCode 之 JavaScript 解答第169題 —— 求眾數 I(Majority Element)LeetCodeJavaScript
- (演算法)求1到1億間的質數或素數演算法