「leetcode」649.Dota2 參議院

原題

Dota2 的世界裏有兩個陣營:Radiant(天輝)和 Dire(夜魘)算法

Dota2 參議院由來自兩派的參議員組成。如今參議院但願對一個 Dota2 遊戲裏的改變做出決定。他們以一個基於輪爲過程的投票進行。在每一輪中,每一位參議員均可以行使兩項權利中的一項:數組

禁止一名參議員的權利:bash

參議員可讓另外一位參議員在這一輪和隨後的幾輪中喪失全部的權利。spa

宣佈勝利:code

若是參議員發現有權利投票的參議員都是同一個陣營的,他能夠宣佈勝利並決定在遊戲中的有關變化。索引

給定一個字符串表明每一個參議員的陣營。字母 「R」 和 「D」 分別表明了 Radiant(天輝)和 Dire(夜魘)。而後,若是有 n 個參議員,給定字符串的大小將是 n。遊戲

以輪爲基礎的過程從給定順序的第一個參議員開始到最後一個參議員結束。這一過程將持續到投票結束。全部失去權利的參議員將在過程當中被跳過。字符串

假設每一位參議員都足夠聰明,會爲本身的政黨作出最好的策略,你須要預測哪一方最終會宣佈勝利並在 Dota2 遊戲中決定改變。輸出應該是 Radiant 或 Dire。string

示例 1:it

輸入: "RD"
輸出: "Radiant"
解釋:  第一個參議員來自  Radiant 陣營而且他可使用第一項權利讓第二個參議員失去權力,所以第二個參議員將被跳過由於他沒有任何權利。而後在第二輪的時候,第一個參議員能夠宣佈勝利,由於他是惟一一個有投票權的人
複製代碼

示例 2:

輸入: "RDD"
輸出: "Dire"
解釋: 
第一輪中,第一個來自 Radiant 陣營的參議員可使用第一項權利禁止第二個參議員的權利
第二個來自 Dire 陣營的參議員會被跳過由於他的權利被禁止
第三個來自 Dire 陣營的參議員可使用他的第一項權利禁止第一個參議員的權利
所以在第二輪只剩下第三個參議員擁有投票的權利,因而他能夠宣佈勝利
複製代碼

注意:

給定字符串的長度在 [1, 10,000] 之間.

思路

在每一輪議會選舉時,天災和近衛的優先策略是禁止臨近的對方參議員的權利。

咱們循環全部參議員,並把雙方對應的索引,存儲到不一樣的數組中。

咱們依次比較兩個數組中,每一位對應的索引。若是天災的索引小於近衛的索引,那麼會淘汰一名近衛的參議院,反之同理。

若是天災和近衛的人數不相等。若是天災的人數大於近衛,咱們會從前淘汰近衛的參議院。反之同理。

當第一次議會循環結束時,咱們重置索引爲0,而後重複上述的過程。當有一方人數爲0的時候,就能夠判斷誰得到了議會的選舉。

本題也是貪心算法的一種,咱們優先作出對局部最優的策略,優先淘汰對方的參議院。減小對方參議院的數量。

代碼

/** * @param {string} senate * @return {string} */
var predictPartyVictory = function(senate) {
    let radiants = []
    let dires = []
    
    let radiantIndex = 0
    let direIndex = 0
    
    for (let i = 0; i < senate.length; i++) {
        if (senate[i] === 'R') {
            radiants.push(i)
        } else {
            dires.push(i)
        }
    }
    
    while (radiants.length && dires.length) {
        
        // 一次循環結束
        if (
            radiants[radiantIndex] === undefined &&
            dires[direIndex] === undefined
        ) {
            radiantIndex = 0
            direIndex = 0
        }
        
        // 若是本次循環中radiants已經結束
        if (
            radiants[radiantIndex] === undefined &&
            dires[direIndex] !== undefined
        ) {
            direIndex += 1
            radiants.shift()
            continue
        }
        
        // 若是本次循環中dires已經結束
        if (
            radiants[radiantIndex] !== undefined &&
            dires[direIndex] === undefined
        ) {
            radiantIndex += 1
            dires.shift()
            continue
        }
        
        // 
        if (dires[direIndex] > radiants[radiantIndex]) {
            radiantIndex += 1
            dires.splice(direIndex, 1)
        } else {
            direIndex += 1
            radiants.splice(radiantIndex, 1)
        }
    }
    
    return radiants.length ? 'Radiant' : 'Dire'
};
複製代碼
相關文章
相關標籤/搜索