https://leetcode.com/problems/dota2-senate/
需要花费一点功夫设计的贪心,没有想出来,因此记录下来。


个人解答

  1. class Solution:
  2. def predictPartyVictory(self, s: str) -> str:
  3. qr = collections.deque()
  4. qd = collections.deque()
  5. for i, x in enumerate(s):
  6. if x == 'R':
  7. qr.append(i)
  8. else:
  9. qd.append(i)
  10. while qr and qd:
  11. r = qr.popleft()
  12. d = qd.popleft()
  13. if r < d:
  14. qr.append(r + len(s))
  15. else:
  16. qd.append(d + len(s))
  17. if not qr:
  18. return 'Dire'
  19. else:
  20. return 'Radiant'

题目分析

其实这个问题的思路很容易想出来,就是要ban掉在自己之后的最近的对方,是个很直观的贪心策略。
但是想写出来总是找不到合适的结构表示。

首先,想到用queue是很直观的,因为就是要不断从左到右读取,但是问题在于,如何处理多轮,循环往复的操作呢?

这里一个小技巧,对于保留下来的,直接 +len(s) 重新push到队列中,如此一来,就可以保持相对的顺序,无感地继续下一轮的操作。

具体如代码所示,整体还是非常清晰的。