https://leetcode.com/problems/dota2-senate/
需要花费一点功夫设计的贪心,没有想出来,因此记录下来。
个人解答
class Solution:
def predictPartyVictory(self, s: str) -> str:
qr = collections.deque()
qd = collections.deque()
for i, x in enumerate(s):
if x == 'R':
qr.append(i)
else:
qd.append(i)
while qr and qd:
r = qr.popleft()
d = qd.popleft()
if r < d:
qr.append(r + len(s))
else:
qd.append(d + len(s))
if not qr:
return 'Dire'
else:
return 'Radiant'
题目分析
其实这个问题的思路很容易想出来,就是要ban掉在自己之后的最近的对方,是个很直观的贪心策略。
但是想写出来总是找不到合适的结构表示。
首先,想到用queue是很直观的,因为就是要不断从左到右读取,但是问题在于,如何处理多轮,循环往复的操作呢?
这里一个小技巧,对于保留下来的,直接 +len(s)
重新push到队列中,如此一来,就可以保持相对的顺序,无感地继续下一轮的操作。
具体如代码所示,整体还是非常清晰的。