【LeetCode】169. 求眾數 結題報告 (C++)
阿新 • • 發佈:2018-11-27
原題地址:https://leetcode-cn.com/problems/majority-element/submissions/
題目描述:
給定一個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 ⌊ n/2 ⌋ 的元素。
你可以假設陣列是非空的,並且給定的陣列總是存在眾數。
示例 1:
輸入: [3,2,3]
輸出: 3
示例 2:
輸入: [2,2,1,1,1,2,2]
輸出: 2
解題方案:
這是以前用過的求眾數的方式:
class Solution { public: int majorityElement(vector<int>& nums) { int count = 0; int candidate = 0; for(int i = 0; i < nums.size(); ++i){ if(count == 0){ candidate = nums[i]; } if(candidate == nums[i]) ++count; else --count; } return candidate; } };
在網上看到有人使用摩爾投票法。
在每一輪投票過程中,從陣列中找出一對不同的元素,將其從陣列中刪除。這樣不斷的刪除直到無法再進行投票,如果陣列為空,則沒有任何元素出現的次數超過該陣列長度的一半。如果只存在一種元素,那麼這個元素則可能為目標元素。那麼有沒有可能出現最後有兩種或兩種以上元素呢?根據定義,這是不可能的,因為如果出現這種情況,則代表我們可以繼續一輪投票。因此,最終只能是剩下零個或一個元素。
class Solution { public int majorityElement(int[] nums) { int result = nums[0], count = 0; for (int num : nums) { if(count == 0) { result = num; count++; }else{ if(result == num) count++; else count--; } } return result; } }