LeetCode - 169. Majority Element

這道題的目的是找到數組中出現次數大於一半的數字,一開始的想法是使用一個HashMap記錄各個數字出現的次數,然後從中找到出現次數大於nums.length / 2的數字,這種方法比較直接,但是使用了O(n)的額外空間,算不上是最好的方法。

LeetCode的discuss版裏有人提出了一個更好的解法,我們首先把majority element設置爲數組的第一個數字,並且把數字出現的次數設置爲count = 1,然後從第二個數字開始向後掃描,如果遇到的數字與majority element相等,那麼count++,否則count--,如果count == 0,那麼把majority element設置爲當前的元素並且把count設置爲1。這個算法的總體思想就是使用出現次數大於nums.length / 2的元素去抵消其他的元素,那麼最後留下的一定是出現次數大於nums.length / 2的元素。代碼如下:

public class Solution {
    public int majorityElement(int[] nums) {
        if(nums == null || nums.length == 0) return 0;
        
        int majorElem = nums[0];
        int count = 1;
        
        for(int i = 1; i < nums.length; i++){
            if(nums[i] == majorElem) count++;
            else if(nums[i] != majorElem) count--;
            
            if(count == 0){
                majorElem = nums[i];
                count++;
            }
        }
        
        return majorElem;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章