【演算法】已知必存在眾數,求該眾數 -- Boyer-Moore 投票演算法

Ch.yang發表於2019-07-10

在這裡插入圖片描述

  • 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)
    是本題的最佳解法

相關文章