LeetCode題解-----Majority Element II 摩爾投票法


題目描述:

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.

 

分析:

因為要找出的是出現次數大於⌊ n/3 ⌋的元素,因此最多只可能存在兩個這樣的元素,而且要求O(1)的空間復雜度,因此只能使用摩爾投票法。首先我們遍歷一遍數組找出兩個候選元素,接着再遍歷一遍數組,判斷候選元素的出現次數是否超過三分之一即可。接着我們確定兩個候選元素,當有候選元素未設置時,先將當前遍歷到的元素設置為候選元素。若遍歷到的元素和其中一個候選元素相等時,候選元素的計數器加一,若和兩個候選元素都不相等,則兩個候選元素的計數器都減一。

其實摩爾投票法的本質就是將元素進行分組,每組中都是不同的元素,最后剩下的那些元素就可能是出現次數最多的元素。例如上文中的解法就是將所有元素分成若干個三元組,每組中的數字都是各不相同的。如果一個元素出現的次數超過了三分之一,那么它必然在剩下的元素中存在,因此它能成為候選元素。

 

代碼:

class Solution {
public:
    vector<int> majorityElement(vector<int>& nums) {
        int m,n,cm,cn;
        m=n=cm=cn=0;
        for(int i=0;i<nums.size();i++){
            if(nums[i]==m){
                cm++;
            }else if(nums[i]==n){
                cn++;
            }else if(cm==0){
                cm++;
                m=nums[i];
            }else if(cn==0){
                cn++;
                n=nums[i];
            }else {
                cm--,cn--;            //消去一個三元組
            }
        }
        
        cm=cn=0;
        for(int i=0;i<nums.size();i++){
            if(nums[i]==m){
                cm++;
            }else if(nums[i]==n){
                cn++;
            }
        }
        vector<int> ans;
        if(cm>nums.size()/3){
            ans.push_back(m);
        }
        if(cn>nums.size()/3){
            ans.push_back(n);
        }
        return ans;
    }
};

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM