LeetCode每日一題:求眾數(No.169)

胖宅老鼠發表於2019-03-21

題目:求眾數


給定一個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 ⌊ n/2 ⌋ 的元素。
你可以假設陣列是非空的,並且給定的陣列總是存在眾數。
複製程式碼

示例:


輸入: [3,2,3]
輸出: 3

輸入: [2,2,1,1,1,2,2]
輸出: 2
複製程式碼

思考:


這道題可以通過摩爾投票演算法來解決。
通俗的講就是:
先假設陣列第0個就是所要求眾數result,用一個變數times記下其出現次數為1次,然後向後遍歷陣列元素分別與這個數對比,如果相等則times+1,這很好理解。
如果不等就說明有另一個數出現了1次,這個數的出現“抵消”了原來result出現的1次,將times-1。
當times等於0時,說明原來認為的眾數result出現次數,被“抵消”完了。則將下一個數認為是新的所求眾數。

注:因為陣列非空且給定的陣列是一定存在這個眾數。所以假如陣列長度為偶數2n,則不會有一個數出現n次其他數也出現n次的情況。
所以按照演算法思路最終會剩下一個數就是所要求的眾數。
複製程式碼

實現:


class Solution {
    public int majorityElement(int[] nums) {
    int result = nums[0];
    int times = 1;
    for (int i = 1; i < nums.length; i++) {
        if (result == nums[i]) {
            times++;
        } else {
            times--;
            if (times == 0) {
                result = nums[++i];
                times++;
            }
        }
    }
    return result;
}
}複製程式碼

相關文章