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 @   BJFU-VTH  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示