1. 程式人生 > >leetcode筆記:Majority Element

leetcode筆記:Majority Element

mar -- ava solution pty parent length lee app

一. 題目描寫敘述

Given an array of size n, find the majority element. The majority element is the element that appears more than ? n/2 ? times.

You may assume that the array is non-empty and the majority element always exist in the array.

二. 題目分析

題目說到,給定一個數組。內含n個元素。找出一個主元素,該元素在數組中出現的次數比其它元素出現的次數加起來還要多。即該元素的數量大於n/2

開始的思路,自然是對數組進行排序,數組最中間的元素就是主元素,但算法復雜度一般須要:O(nlogn);若同意輔助內存。可新建一個數組。用於存放不同元素值在數組中存放的次數。這樣僅僅需遍歷一次原數組,然後再遍歷一次記錄次數的數組就可找出主元素。算法復雜度為O(n)

一種高效的方法僅僅需遍歷一次數組就可以。

我們知道主元素出現的次數比其它元素出現的次數和還要大,因此,僅僅需使用兩個變量:candidatecount這兩個變量記錄了元素candidate的值,count記錄了元素candidate比其它元素多出現的次數。

遍歷數組,遇到與當前記錄元素candidate同樣的元素值,++count

;否則count被抵消一次。--count。當count變為0時,更換candidate為當前遍歷所在的像素值。

由於遍歷完數組後,主元素被抵消的次數count比然大於零,不會由於當count變為0而被其它數組元素替代。因此candidate也僅僅會是主元素。

三. 演示樣例代碼

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int candidate = 0, count = 0;
        for (int i = 0; i < nums.size(); ++i)
        {
            if
(count == 0) { candidate = nums[i]; ++count; } else { if (candidate == nums[i]) ++count; else --count; } } return candidate; } };

leetcode筆記:Majority Element