《Leetcode of December》649. Dota2 参议院

class Solution:
    def predictPartyVictory(self, senate: str) -> str:
        stack = list(senate)
        radiant = deque()
        dire = deque()
        #先将两方阵容的位置都记录下来
        for i,char in enumerate(stack) :
            if char=='R':
                radiant.append(i)
            else:
                dire.append(i)
        n=len(stack)
        #然后循环遍历两个列表,直到其中一个列表为空
        while radiant and dire:
            #如果r在d前,就kill掉一个dire的人,并且自己增加一个;反之
            if radiant[0]<dire[0]:
                radiant.append(radiant[0]+n)
            else:
                dire.append(dire[0]+n)
            
            #经过一次遍历,r和d都弹出当前的元素,但是之前说如果那个小那个就会增加一人,否则另一方就损失一人
            radiant.popleft()
            dire.popleft()

        return "Radiant" if radiant else "Dire"
  • 声明两个队列,分别将radiant和dire出现的index添加进去
  • 这个游戏的规则就是index小的以方可以禁止index大的另一方,经过几轮看哪个阵容还有人哪个阵容就赢
  • 同时遍历队列radiant和dire
  • 如果radiant的index小于dire的index,那就说明radiant有优先权
    • 那么首先dire的index弹出,也就是kill掉敌方的一个人
    • 然后将本身也弹出,并且将弹出的元素再加上数组的长度添加到队列的末尾表示可以进入下一轮游戏
  • 如果radiant的index大于dire的index,那就说明dire有优先权
    • 首先radiant的index弹出,kill掉敌方阵营的一个人
    • 然后将本身也弹出,并且将弹出的元素再加上数组的长度进入到下一轮游戏
  • 这样反复遍历,直到有一方阵容为空;那么非空的那个阵容就胜利
  • 采取了循环队列的方法
    • 为啥先弹出在添加?可以想象这一轮的游戏已经结束,该kill的kill,该升级的升级,因此把弹出的加上数组长度给升级了

总结:双循环队列的一个应用。

猜你喜欢

转载自blog.csdn.net/weixin_37724529/article/details/111029652