如何用Boyer Moore選舉演算法解決問題?

2021-07-24 03:07:07 字數 1444 閱讀 9545

boyer–moore選舉演算法是乙個經典的用於找一組元素中出現次數超過元素個數一半的演算法,該演算法有線性時間複雜度和常數空間複雜度,是從現實生活中的選舉問題抽象出來的,且看**:

public

class

solution

else

count--;

}return major;

}}

對這個演算法的疑惑集中於變數count的意義。我們可以想象以下的場景:在乙個廣場上有n個選民,他們心裡都有乙個已經選定的,非常堅定支援的候選人,還有乙個主持這次選舉的人。這n個選民中有這樣乙個龐大的隱藏的群體,他們都十分認可a這個人的工作能力,並且他們的總數已經超過了n/2。是的,這些選民選擇的a正是我們要找的人。

接下來看看選舉的過程吧,我們先構造乙個對a最不利的場景,就是這些選民中除了a的支持者外其他的都是b的支持者,所以大多數情況下當主持人選乙個選民唸出他的a的支持者的時候,不出意外會有b的支持者迅速表示支援b,從而抵消a的這一票,所以最後我們只看相互抵消後剩餘的票數就行了,由於a的支持者更多,所以a最後肯定勝出。可以看出來這正是boyer–moore選舉演算法的工作過程。

剛才的情況是對a最不利的一種,還有可能a的競爭者不止b乙個人,有可能會有c,d等等,那麼有時候還不等a的支持者出手,支援b的票就可能會被c或者d的支持者抵消,那最後統計剩餘票數的時候不是a的更有優勢嘛。

傳統的boyer–moore選舉演算法是這樣工作的,如果我們修改這個選舉過程,選出得票數超過n/3的候選人,那應該怎麼做呢?

首先應該想到,這樣的候選人不能超過兩個,如果有多於兩個的候選人存在,那麼一定是人群中有人偷偷的投了不止一票了,且看**:

public

class solution

int k1 = nums[0], k2 = nums[0], c1 = 1, c2 = 0;

for(int v : nums)

else

if(v ==k2)

else

if(c1 == 0)

else

if(c2 == 0)

else

}c1 = 0; c2 = 0;

for(int v : nums)

listarr = new arraylist();

if(c1 > nums.length/3) arr.add(k1);

if(c2 > nums.length/3) arr.add(k2);

return arr;

}}

思路與之前如出一轍,需要注意c2的初始化值是0,而不是1,這樣做是為了避免當輸入是[1],或者是[1,2],的時候出現意外的結果。

該問題來自leetcode oj

- majority-element-ii

- majority-element

如何用軟文推廣

如何用軟文推廣呢?2 作為 魚餌 讓客戶通過付出一些行動,比如幫忙推廣10個ip,或者通過加qq,留下郵箱 手機號等方式,獲得大量的精準潛在客戶資料庫,最大化軟文的效率。高質量軟文製作技巧 寫作軟文前,一定要做好規劃,明確軟文推廣要達到的目的,了解消費者的對產品的各種問題和顧慮,針對性的提出解決方案...

如何用gitbook寫書

生成一本小書,它有前言,章節1,章節2,後記。例如 簡介 第一章 如何造火箭 1.燃料學 2.空氣動力學 3.工程學 第二章 如何 火箭 1.自動控制原理 2.二次利用要點 結束建乙個寫書的目錄,以後所有工作都在這個目錄下搞。例如 users raywill gitbook first在電腦上建立整...

如何用好Google?

如何提高自己的搜尋技術?男性凱格爾運動 掌握搜尋邏輯和搜尋思路。願意為優質的付費是高效的解決問題思路。盡量少使用搜尋引擎 針對不同的問題使用不同的資料庫。搜尋心法 找什麼 找 怎麼找。搜尋技巧 遇到問題 第一件事就是搜尋 搜尋。搜尋也是可以轉變思維方式 書友沙龍 可直接看轉化為 樊登讀書會 舉辦的讀...