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)

 

posted @ 2023-01-09 23:21  BJFU-VTH  阅读(30)  评论(0编辑  收藏  举报