Featured image of post Dota 2 Senate

Dota 2 Senate

649. Dota2参议院

分析

使用两个队列分别存储两派参议员的索引位置,模拟投票过程:

  1. 遍历输入字符串 senate
    • 'R' 的索引存入队列 r
    • 'D' 的索引存入队列 d
  2. 模拟投票过程:
    • 每轮从两个队列中各取出一个参议员的索引
    • 索引较小的一方(出场顺序在前)可以禁言对方阵营的参议员,并将自己放回队列末尾,索引增加 n(表示其下一轮出场的顺序)
    • 索引较大的参议员失去投票权,从队列中移除
  3. 重复上述过程,直到某一队列为空
  4. 判断结果:
    • 如果 r 非空,返回 "Radiant"
    • 如果 d 非空,返回 "Dire"

时间复杂度

  • 初始化队列:O(n),遍历字符串一次
  • 模拟投票:每次至少移除一个参议员,最多进行 O(n)

总时间复杂度为 O(n)

空间复杂度

空间复杂度为 O(n)

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public:
    string predictPartyVictory(string senate)
    {
        std::queue<int> r, d; // 分别存储两派参议员的索引
        int n = senate.size();

        // 初始化队列
        for (int i = 0; i < n; ++i)
            if (senate[i] == 'R')
                r.push(i);
            else
                d.push(i);

        // 模拟投票过程
        while (!r.empty() && !d.empty())
        {
            int r_index = r.front();
            int d_index = d.front();
            r.pop();
            d.pop();
            // 索引较小的参议员胜出,加入下一轮
            if (r_index < d_index)
                r.push(r_index + n); // Radiant 禁言 Dire
            else
                d.push(d_index + n); // Dire 禁言 Radiant
        }

        // 判断获胜阵营
        return r.empty() ? "Dire" : "Radiant";
    }
};
Built with Hugo
Theme Stack designed by Jimmy