回覆列表
  • 1 # 使用者7272742818983

    多數投票演算法是一種用O(1)的空間複雜度,來求出陣列中眾數的演算法:

    其實這個演算法十分好理解,最直觀的說,我們要再陣列中找到大於n/k的數,首先我們要明白一件事,舉個例子,k=2,這時候,整個陣列中比n/2還要多的數只有可能是一個,而k=3時,陣列中比n/3還要多的數最多也只能有兩個,同理可得,當為k的時候,陣列中出現這種元素的個數最多隻有可能有k-1個。

    所以,到這裡,我們可以設k-1個候選人,一個不同元素,每一個候選人都有一個自己的票數統計,如果下一個元素投票是跟某一個候選人相同,當前候選人的票數加一,如果都不相同,先判斷候選人的票數有沒有被清空,如果被清空,則更換候選人,票數置一,當然,如果候選人都為空,也只能更換一個候選人,一個人投票不可能當多個候選人,如果當前元素投票是與所有候選人無關,而且所有候選人都有票數,那就把當前投票拋棄,將所有候選人的票數減一。

    遍歷一遍陣列過後,我們得到了最後的候選人名單,然而,是不是這些候選人都是呢?當然不確定,此時我們還要把他們的票數全部置零,然後再重新遍歷一遍陣列,重新真正的統計他們的票數,最後,如果有達到要求的,就壓入陣列。

    當然,免得大家說我空談,我就先寫一個k=3的解法來闡述我上面的流程:

    vector<int> findthree(vector<int> &nums){

    int size=nums.size();

    int result1=INT_MIN;

    int result2=INT_MIN;

    int count1=0;

    int count2=0;

    for(int i=0;i<size;i++){

    if(result1==nums[i])

    count1++;

    else if(result2==nums[i])

    count2++;

    else if(count1==0){

    result1=nums[i];

    count1++;}

    else if(count2==0){

    result2=nums[i];

    count2++;}

    else{

    count1--;

    count2--;

    }

    vector<int> result_;

    count1=count2=0;

    for(int i=0;i<size;i++)

    {

    if(result1==nums[i])

    count1++;

    else if(result2==nums[i])

    count2++;

    }

    if(count1>size/3) result_.push_back(result1);

    if(count2>size/3) result_.push_back(result2);

    return result_;

    }

  • 中秋節和大豐收的關聯?
  • 學習數學應該養成哪些好習慣?