Leetcode 649

R和D輪着投票,每一次每個人可以選擇一個對方的人讓他沒有投票權,都選最優策略的時候誰能勝利

 

稍微思考可以發現:

RD R win

DR D win

也就是說下標小的時候佔優勢

 

我開始以爲誰多誰就勝利,其實不是的,比如

DDRRR,這個是時候Dwin,因爲第一輪過後 會變爲什麼呢?

DDR?其實不是的,可以這樣決策,第一個D和第二個D分別讓第三個R和第四個R失去權力,然後最後一個R讓第一個D失去權力

就變爲了DR

接下來就是D win

 

因此我們有一個想法:分別把D和R的下標放入隊列裏,每次pop出一個比較他們的下標,小的下標可以讓大的失去權力,然後進入下一輪比較,同時呢,隊列較多的那個元素的其實要保存的下來的,他們是可以讓之前存活下的(也就是讓別人失去權力的那些)那些失去權力的,他們的下標應該是比較小的。

我們在實現的時候通過一個巧妙的 +n 來實現這一點。

 

代碼實現:

    public String predictPartyVictory(String senate) {
        Queue<Integer> d = new ArrayDeque<>();
        Queue<Integer> r = new ArrayDeque<>();
        int n = senate.length();
        for (int i = 0; i < n; i++) {
            if (senate.charAt(i) == 'D') d.add(i);
            else r.add(i);
        }

        while (!d.isEmpty() && !r.isEmpty()) {
            while (!d.isEmpty() && !r.isEmpty()) {
                int dpoll = d.poll();
                int rpoll = r.poll();
                if (dpoll < rpoll) d.add(dpoll + n);
                else r.add(rpoll + n);
            }
        }
        return d.isEmpty() ? "Radiant" : "Dire";
    }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章