多數投票演算法是一種用O(1)的空間複雜度,來求出陣列中眾數的演算法:
其實這個演算法十分好理解,最直觀的說,我們要再陣列中找到大於n/k的數,首先我們要明白一件事,舉個例子,k=2,這時候,整個陣列中比n/2還要多的數只有可能是一個,而k=3時,陣列中比n/3還要多的數最多也只能有兩個,同理可得,當為k的時候,陣列中出現這種元素的個數最多隻有可能有k-1個。
所以,到這裡,我們可以設k-1個候選人,一個不同元素,每一個候選人都有一個自己的票數統計,如果下一個元素投票是跟某一個候選人相同,當前候選人的票數加一,如果都不相同,先判斷候選人的票數有沒有被清空,如果被清空,則更換候選人,票數置一,當然,如果候選人都為空,也只能更換一個候選人,一個人投票不可能當多個候選人,如果當前元素投票是與所有候選人無關,而且所有候選人都有票數,那就把當前投票拋棄,將所有候選人的票數減一。
遍歷一遍陣列過後,我們得到了最後的候選人名單,然而,是不是這些候選人都是呢?當然不確定,此時我們還要把他們的票數全部置零,然後再重新遍歷一遍陣列,重新真正的統計他們的票數,最後,如果有達到要求的,就壓入陣列。
當然,免得大家說我空談,我就先寫一個k=3的解法來闡述我上面的流程:
vector<int> findthree(vector<int> &nums){
int size=nums.size();
int result1=INT_MIN;
int result2=INT_MIN;
int count1=0;
int count2=0;
for(int i=0;i<size;i++){
if(result1==nums[i])
count1++;
else if(result2==nums[i])
count2++;
else if(count1==0){
result1=nums[i];
count1++;}
else if(count2==0){
result2=nums[i];
count2++;}
else{
count1--;
count2--;
}
vector<int> result_;
count1=count2=0;
for(int i=0;i<size;i++)
{
if(count1>size/3) result_.push_back(result1);
if(count2>size/3) result_.push_back(result2);
return result_;
多數投票演算法是一種用O(1)的空間複雜度,來求出陣列中眾數的演算法:
其實這個演算法十分好理解,最直觀的說,我們要再陣列中找到大於n/k的數,首先我們要明白一件事,舉個例子,k=2,這時候,整個陣列中比n/2還要多的數只有可能是一個,而k=3時,陣列中比n/3還要多的數最多也只能有兩個,同理可得,當為k的時候,陣列中出現這種元素的個數最多隻有可能有k-1個。
所以,到這裡,我們可以設k-1個候選人,一個不同元素,每一個候選人都有一個自己的票數統計,如果下一個元素投票是跟某一個候選人相同,當前候選人的票數加一,如果都不相同,先判斷候選人的票數有沒有被清空,如果被清空,則更換候選人,票數置一,當然,如果候選人都為空,也只能更換一個候選人,一個人投票不可能當多個候選人,如果當前元素投票是與所有候選人無關,而且所有候選人都有票數,那就把當前投票拋棄,將所有候選人的票數減一。
遍歷一遍陣列過後,我們得到了最後的候選人名單,然而,是不是這些候選人都是呢?當然不確定,此時我們還要把他們的票數全部置零,然後再重新遍歷一遍陣列,重新真正的統計他們的票數,最後,如果有達到要求的,就壓入陣列。
當然,免得大家說我空談,我就先寫一個k=3的解法來闡述我上面的流程:
vector<int> findthree(vector<int> &nums){
int size=nums.size();
int result1=INT_MIN;
int result2=INT_MIN;
int count1=0;
int count2=0;
for(int i=0;i<size;i++){
if(result1==nums[i])
count1++;
else if(result2==nums[i])
count2++;
else if(count1==0){
result1=nums[i];
count1++;}
else if(count2==0){
result2=nums[i];
count2++;}
else{
count1--;
count2--;
}
vector<int> result_;
count1=count2=0;
for(int i=0;i<size;i++)
{
if(result1==nums[i])
count1++;
else if(result2==nums[i])
count2++;
}
if(count1>size/3) result_.push_back(result1);
if(count2>size/3) result_.push_back(result2);
return result_;
}