題目:給定一個(gè)大小為 n 的數(shù)組,找到其中的眾數(shù)惹骂。眾數(shù)是指在數(shù)組中出現(xiàn)次數(shù)大于 ? n/2 ? 的元素。你可以假設(shè)數(shù)組是非空的做瞪,并且給定的數(shù)組總是存在眾數(shù)对粪。
示例 1:
輸入:[3,2,3]
輸出:3
示例 2:
輸入:[2,2,1,1,1,2,2]
輸出:2
解答如下:
簡單的方法不多說,無非是用數(shù)組來以空間換時(shí)間装蓬,數(shù)組下標(biāo)為輸入的值著拭,數(shù)組的值為當(dāng)前數(shù)字(即數(shù)組下標(biāo))出現(xiàn)的個(gè)數(shù)。這種方法及其容易想到牍帚,但是耗費(fèi)空間比較大儡遮,而且我們未必知道輸入的數(shù)組中最大的數(shù)是多少,若是數(shù)字過于分散暗赶,則會造成很大的空間浪費(fèi)鄙币,所以我們一般不會去采用這樣的方法。接下來我要說的是一種非常簡單的方法忆首,時(shí)間復(fù)雜度為O(n)爱榔,空間復(fù)雜度為O(1)被环。
在解決這個(gè)問題前我們需要介紹一下摩爾投票算法糙及,解答這個(gè)問題正是應(yīng)用到這個(gè)方法。
Boyer-Moore majority vote algorithm(摩爾投票算法)是一種線性時(shí)間復(fù)雜度和常數(shù)級空間復(fù)雜度的算法筛欢,用來查找元素序列中的眾數(shù)浸锨。
該算法定義了兩個(gè)變量:一個(gè)是目前出現(xiàn)次數(shù)最多的數(shù)num,一個(gè)是計(jì)數(shù)器count版姑,計(jì)數(shù)器初值為零柱搜。 然后我們遍歷序列中的每個(gè)元素。如果count==0剥险,則num=x;count=1;(其中x表示我們遍歷到的元素)聪蘸。 如果num==x,那么count++,否則count--健爬。 最后返回m即可控乾。
回到我們的題目當(dāng)中:
首先可以將num賦值為0,count必須為0娜遵。碰到數(shù)組的第一個(gè)值(即count為0時(shí))蜕衡,要將該值賦給num(此時(shí)它出現(xiàn)的次數(shù)最多),count值=1设拟,若下一個(gè)數(shù)字一樣慨仿,則count++(說明當(dāng)前值出現(xiàn)次數(shù)多了一次),若不一樣纳胧,則count--镰吆,若count=0,則令num=x(即說明跑慕,只有count不為0鼎姊,num代表的值就是當(dāng)前出現(xiàn)次數(shù)最多的值)
代碼實(shí)現(xiàn)如下所示:
class Solution {
public:
int majorityElement(vector<int>& nums) {
int len=nums.size();
if(len<=0) return 0;
int num=0,count=0;
for(int i=0;i<len;i++){
if(count==0){
num=nums[i];
}
if(num==nums[i]){
count++;
}
if(num!=nums[i]){
count--;
}
}
return num;
}
};