【力扣每日一题】649.Dota2 参议院

【力扣每日一题】649.Dota2 参议院_第1张图片

可以使用循环队列存储投票的顺序。
以下是一种简单的容易理解的实现方式:

  • 使用两变量 D_cnt 和 R_cnt 分别存储 R 方和 D 方的投票人数
  • 使用 dec_R 和 dec_D 分别存储 R 方和 D方别投出的人数
  • 当队列首位被票出时,直接将队首弹出,否则投出对方一位参议员,且将队首移到队尾,等待下一次投票。
class Solution {
public:
    string predictPartyVictory(string senate) {
        queue<char> q;
        int R_cnt(0);
        int D_cnt(0);
        for (char &ch : senate) {
            q.push(ch);
            'R' == ch ? ++R_cnt : ++D_cnt;
        }
        int dec_R(0); // 统计被投出的 R 的数量
        int dec_D(0); // 统计被投出点 D 的数量
        char head;
        while (R_cnt && D_cnt) {
            head = q.front();
            q.pop();
            if ('R' == head) {
                if (dec_R) {
                    --dec_R;
                } else {
                    ++dec_D;
                    --R_cnt;
                    q.push(head);
                }
            } else {
                if (dec_D) {
                    --dec_D;
                } else {
                    ++dec_R;
                    --D_cnt;
                    q.push(head);
                }
            }
        }
        return R_cnt ? "Radiant" : "Dire";
    }
};

你可能感兴趣的:(力扣,队列,数据结构)