摩爾投票
阿新 • • 發佈:2021-07-09
題目
方法
真簡單!
雜湊表!計數!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; } };