911. 在線選舉(Python)

難度:★★★☆☆
類型:數(shù)據(jù)結(jié)構(gòu)
方法:二分法

題目

力扣鏈接請(qǐng)移步本題傳送門(mén)
更多力扣中等題的解決方案請(qǐng)移步力扣中等題目錄

在選舉中灰羽,第 i 張票是在時(shí)間為 times[i] 時(shí)投給 persons[i] 的驮履。

現(xiàn)在鱼辙,我們想要實(shí)現(xiàn)下面的查詢函數(shù): TopVotedCandidate.q(int t) 將返回在 t 時(shí)刻主導(dǎo)選舉的候選人的編號(hào)。

在 t 時(shí)刻投出的選票也將被計(jì)入我們的查詢之中玫镐。在平局的情況下倒戏,最近獲得投票的候選人將會(huì)獲勝。

示例:

輸入:["TopVotedCandidate","q","q","q","q","q","q"], [[[0,1,1,0,0,1,0],[0,5,10,15,20,25,30]],[3],[12],[25],[15],[24],[8]]
輸出:[null,0,1,1,0,0,1]
解釋:
時(shí)間為 3恐似,票數(shù)分布情況是 [0]杜跷,編號(hào)為 0 的候選人領(lǐng)先。
時(shí)間為 12矫夷,票數(shù)分布情況是 [0,1,1]葛闷,編號(hào)為 1 的候選人領(lǐng)先。
時(shí)間為 25双藕,票數(shù)分布情況是 [0,1,1,0,0,1]孵运,編號(hào)為 1 的候選人領(lǐng)先(因?yàn)樽罱耐镀苯Y(jié)果是平局)。
在時(shí)間 15蔓彩、24 和 8 處繼續(xù)執(zhí)行 3 個(gè)查詢治笨。

提示:

1 <= persons.length = times.length <= 5000
0 <= persons[i] <= persons.length
times 是嚴(yán)格遞增的數(shù)組,所有元素都在 [0, 10^9] 范圍中赤嚼。
每個(gè)測(cè)試用例最多調(diào)用 10000 次 TopVotedCandidate.q旷赖。
TopVotedCandidate.q(int t) 被調(diào)用時(shí)總是滿足 t >= times[0]。

解答

實(shí)際上只有兩個(gè)問(wèn)題需要考慮:

  1. 如何記錄各個(gè)標(biāo)志性時(shí)刻下的當(dāng)前獲勝者更卒;
  2. 如何查詢給定時(shí)刻的獲勝者等孵。

這兩個(gè)問(wèn)題,根據(jù)題目的函數(shù)定義格式蹂空,我們分別寫(xiě)在init函數(shù)和q函數(shù)中俯萌。

定義一個(gè)實(shí)例變量self.winner,這是一個(gè)列表上枕,列表中記錄各個(gè)標(biāo)志時(shí)刻下的當(dāng)前獲勝者咐熙。這里的標(biāo)志時(shí)刻,也就是輸入的times列表辨萍,我們把它也存儲(chǔ)在實(shí)例變量self.times中棋恼,查詢函數(shù)中需要用。

時(shí)刻和當(dāng)前被投票者是成對(duì)出現(xiàn)的锈玉,我們需要準(zhǔn)備一個(gè)計(jì)票器變量votes_of_爪飘,該變量是一個(gè)字典,字典的鍵是各個(gè)候選人拉背,值是各個(gè)候選人的得票师崎。為了便于計(jì)算,我們用python中內(nèi)置的default_dict實(shí)現(xiàn)椅棺,在簡(jiǎn)化表達(dá)的同時(shí)犁罩,省去了找不到鍵的困擾齐蔽。我們還需要準(zhǔn)備中間變量winner_by_now和max_ticket,用以記錄當(dāng)前獲勝的選手及其選票昼汗。

按照時(shí)間順序遍歷各個(gè)投票事件,將當(dāng)前候選人person的選票加一鬼雀,同時(shí)需要及時(shí)的查看這個(gè)候選人是否已經(jīng)達(dá)記錄中曾經(jīng)有過(guò)的最大選票值顷窒,一旦該候選人選票達(dá)到或超過(guò)max_ticket,則說(shuō)明該候選人已經(jīng)成為當(dāng)前時(shí)刻的贏家源哩,需要及時(shí)更新中間變量winner_by_now和max_ticket鞋吉。

在查詢函數(shù)q中,我們使用二分查找法励烦,可以快速定位所查詢的時(shí)間在記錄中出現(xiàn)的位置谓着,由于時(shí)刻列表與各個(gè)時(shí)刻對(duì)應(yīng)的贏家是對(duì)應(yīng)的,找到輸入時(shí)間t對(duì)應(yīng)于時(shí)間列表self.times中的合理位置坛掠,就可以根據(jù)這個(gè)位置快速找到該時(shí)刻對(duì)應(yīng)的贏家赊锚。我們使用bisect可以快速實(shí)現(xiàn)二分法定位操作,注意返回的是插入位置屉栓,需要將該下標(biāo)index-1才能作為當(dāng)前查詢時(shí)刻所在位置舷蒲。

import bisect
from collections import defaultdict
class TopVotedCandidate:
    def __init__(self, persons, times):
        self.times = times
        self.winner = []
        votes_of_ = defaultdict(int)
        winner_by_now = persons[0]
        max_ticket = 0
        for person in persons:
            votes_of_[person] += 1
            if votes_of_[person] >= max_ticket:
                winner_by_now = person
                max_ticket = votes_of_[person]
            self.winner.append(winner_by_now)

    def q(self, t):
        index = bisect.bisect(self.times, t) - 1
        return self.winner[index]

如有疑問(wèn)或建議,歡迎評(píng)論區(qū)留言~

有關(guān)更多力扣中等題的python解決方案友多,請(qǐng)移步力扣中等題解析

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牲平,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子域滥,更是在濱河造成了極大的恐慌纵柿,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件启绰,死亡現(xiàn)場(chǎng)離奇詭異昂儒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)委可,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)荆忍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人撤缴,你說(shuō)我怎么就攤上這事刹枉。” “怎么了屈呕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵微宝,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我虎眨,道長(zhǎng)蟋软,這世上最難降的妖魔是什么镶摘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮岳守,結(jié)果婚禮上凄敢,老公的妹妹穿的比我還像新娘。我一直安慰自己湿痢,他們只是感情好涝缝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著譬重,像睡著了一般拒逮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上臀规,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天滩援,我揣著相機(jī)與錄音,去河邊找鬼塔嬉。 笑死玩徊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谨究。 我是一名探鬼主播佣赖,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼记盒!你這毒婦竟也來(lái)了憎蛤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纪吮,失蹤者是張志新(化名)和其女友劉穎俩檬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碾盟,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棚辽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冰肴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屈藐。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熙尉,靈堂內(nèi)的尸體忽然破棺而出联逻,到底是詐尸還是另有隱情,我是刑警寧澤检痰,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布包归,位于F島的核電站,受9級(jí)特大地震影響铅歼,放射性物質(zhì)發(fā)生泄漏公壤。R本人自食惡果不足惜换可,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厦幅。 院中可真熱鬧沾鳄,春花似錦、人聲如沸确憨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)缚态。三九已至磁椒,卻和暖如春堤瘤,著一層夾襖步出監(jiān)牢的瞬間玫芦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工本辐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桥帆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓慎皱,卻偏偏與公主長(zhǎng)得像老虫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茫多,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容