390. 消除游戏
问题链接
https://leetcode.cn/problems/elimination-game/
解题思路
这题需要推理,和约瑟夫环一样。我暂时不想去深入研究,只想用模拟。
这题其实可以用递归来解,因为他每一层的处理方式几乎一模一样。
我们首先看参数和返回值。我们期望接收到一个数组和一个flag,返回最后剩下的值。
这个数组代表了我们模拟的数组,flag代表了我们是从做往右处理还是从右往左处理。
然后我们设计本层做什么以及缩小规模。
本层应该根据flag,按照题目中提到的规律,删除掉该删除的元素。
然后将处理好的数组传到下一层递归继续进行处理。
最后我们看递归的退出条件。
显然,最后剩下一个,那就该退出了,这就是结果。
代码
class Solution: def lastRemaining(self, n: int) -> int: def dfs(li, flag): if len(li) == 1: return li[0] nxt = [] if flag: for i in range(len(li)): if i % 2 == 1: nxt.append(li[i]) else: for i in range(len(li[::-1])): if i % 2 == 1: nxt.append(li[i]) nxt = nxt[::-1] return dfs(nxt, not flag) return dfs([i for i in range(1, n+1)], True)