1. 程式人生 > 其它 >摩爾投票

摩爾投票

題目

面試題 17.10. 主要元素

方法

真簡單!

雜湊表!計數!return! 完活!
……………………………………
等等,題目要求O(1)空間,這……

核心是對拼消耗

  • 我們把這個陣列想象成一排士兵,他們來自不同的國家,而且不同國家都是敵對關係,也就是說兩兩相遇就會開打。
  • 假設從左往右進行車輪戰,每個士兵的戰鬥力相同,即敵對士兵兩兩開打會兩敗俱死!定義【勢力】為某國士兵的個數,即同國士兵相遇會【勢力】+ 1
  • 當車輪戰結束後,最後一定是沒有人活著,或者活下來的都是同一國家的
  • 那麼活下來的勢力一定就是參戰中勢力最雄厚的嘛(指人最多)?不是的,假設總共有2n+1個士兵參戰,其中n個屬於一方,另n個屬於另一方,最後一方勢力只有一個人,也許前兩方殺紅了眼兩敗俱傷了,最後被剩下的一個人撿漏了也是可能的。
  • 怎麼判斷這個人是撿漏的呢?人不夠多。假如【勢力】超過總人數的一半,那絕對不會出現撿漏的。

code:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int alive = 0;//活著的人
        int type = -1;//因為nums是整數陣列所以可以初始化為負值
        for(auto& num : nums){
            //沒有活著的人
            if(!alive){
                type = num;
                alive++;
            }else{
                if(num == type){
                    alive++;
                }else{
                    alive--;
                }
            }
        }
        if(alive == 0) return -1;
        int ans = 0;
        for(auto& num : nums){
            if(num == type){
                ans++;
            }
        }
        return ans > nums.size() / 2 ? type : -1;
    }
};