題目:給定一個大小為 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ù)組的值為當前數(shù)字(即數(shù)組下標)出現(xiàn)的個數(shù)。這種方法及其容易想到,但是耗費空間比較大,而且我們未必知道輸入的數(shù)組中最大的數(shù)是多少,若是數(shù)字過于分散,則會造成很大的空間浪費,所以我們一般不會去采用這樣的方法。接下來我要說的是一種非常簡單的方法,時間復雜度為O(n),空間復雜度為O(1)。
在解決這個問題前我們需要介紹一下摩爾投票算法,解答這個問題正是應(yīng)用到這個方法。
Boyer-Moore majority vote algorithm(摩爾投票算法)是一種線性時間復雜度和常數(shù)級空間復雜度的算法,用來查找元素序列中的眾數(shù)。
該算法定義了兩個變量:一個是目前出現(xiàn)次數(shù)最多的數(shù)num,一個是計數(shù)器count,計數(shù)器初值為零。 然后我們遍歷序列中的每個元素。如果count==0,則num=x;count=1;(其中x表示我們遍歷到的元素)。 如果num==x,那么count++,否則count--。 最后返回m即可。
回到我們的題目當中:
首先可以將num賦值為0,count必須為0。碰到數(shù)組的第一個值(即count為0時),要將該值賦給num(此時它出現(xiàn)的次數(shù)最多),count值=1,若下一個數(shù)字一樣,則count++(說明當前值出現(xiàn)次數(shù)多了一次),若不一樣,則count--,若count=0,則令num=x(即說明,只有count不為0,num代表的值就是當前出現(xiàn)次數(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;
}
};