

这是一个典型的队列模拟问题,可以使用两个队列分别存储 'R' 和 'D' 参议员的索引位置,然后模拟投票过程。下面是解决方案:
思路:
-
使用队列存储参议员的位置
- 遍历
senate,将'R'和'D'分别存入两个队列radiant和dire中,存储它们的索引位置。
- 遍历
-
模拟投票过程
- 取出
radiant和dire各自的队首元素,比较它们的索引。 - 较小索引的参议员(在前面出现的)可以投票禁止较大索引的参议员,并且该参议员可以在下一轮重新参与投票(索引+
n,表示下一轮)。 - 被禁止的参议员则从游戏中移除(不再加入队列)。
- 取出
-
循环进行投票,直到某个队列为空
- 如果
radiant为空,返回"Dire"; - 如果
dire为空,返回"Radiant"。
- 如果
代码:
from collections import deque
def predictPartyVictory(senate: str) -> str:
n = len(senate)
radiant = deque()
dire = deque()
# 将 R 和 D 的索引分别存入队列
for i, s in enumerate(senate):
if s == 'R':
radiant.append(i)
else:
dire.append(i)
# 轮流投票
while radiant and dire:
r_index = radiant.popleft()
d_index = dire.popleft()
# 较小索引的参议员可以继续存活,并将在下一轮投票
if r_index < d_index:
radiant.append(r_index + n) # Radiant 获胜,放回队列
else:
dire.append(d_index + n) # Dire 获胜,放回队列
# 如果 Radiant 队列还有人,则 Radiant 获胜,否则 Dire 获胜
return "Radiant" if radiant else "Dire"
复杂度分析:
- 遍历字符串初始化队列:O(n)
- 由于每个参议员最多被投票一次,每轮都会淘汰一个人,因此最多 O(n) 轮。
- 由于队列操作是 O(1),整个算法的时间复杂度是 O(n)。
示例:
print(predictPartyVictory("RD")) # "Radiant"
print(predictPartyVictory("RDD")) # "Dire"
print(predictPartyVictory("RRDDD")) # "Radiant"
这个方法巧妙利用了 队列 进行 模拟,保证每轮都按照索引顺序进行投票,非常高效!
995

被折叠的 条评论
为什么被折叠?



