【每日算法Day 85】图解算法:一行代码解决约瑟夫环的变体

题目链接

LeetCode 390. 消除游戏[1]

题目描述

给定一个从 1n 排序的整数列表。 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾。 第二步,在剩下的数字中,从右到左,从倒数第一个数字开始,每隔一个数字进行删除,直到列表开头。 我们不断重复这两步,从左到右和从右到左交替进行,直到只剩下一个数字。 返回长度为 n 的列表中,最后剩下的数字。

示例1

        输入:
n = 9,
1 2 3 4 5 6 7 8 9
2 4 6 8
2 6
6
输出:
6

      

题解

还记得几天前讲过的约瑟夫环问题吗?不记得了就回顾一下吧:

韦阳的博客:【每日算法Day 74】经典面试题:约瑟夫环,我敢打赌你一定不会最后一种方法![2]

知乎专栏:【每日算法Day 74】经典面试题:约瑟夫环,我敢打赌你一定不会最后一种方法![3]

当时我们的方法是通过编号映射来递归寻找下一轮存活的人的,那么这题也可以尝试用同样的方法。

我们分奇偶两种情况来考虑。

v2-18c5b0e8c503a39bf2d6f3f7fd9c0f19_b.jpg

如果 ,那么如上图所示,第一轮消除完了之后,剩下的数字就是绿色的偶数部分。

接着就要从右往左递归地消除了,那我们从右往左给绿色数字重新编号为 1k ,问题就转化为了 k 个数字的情况下,最后剩余的数字是几了。

假设我们用 f(2k) 表示初始时 个数字最后剩下的编号,那么绿色部分重新编号后最后剩下的数字就是 f(k) 。但是怎么将 f(k) 重新映射回绿色的数字编号呢?

通过观察我们可以发现,绿色数字整除 2 ,再加上蓝色的映射后的编号,结果一定等于 。所以我们就得到了映射回去的公式:

比如说你求出来 ,也就是蓝色部分最后剩下的数字是 2 ,那么映射成绿色的编号就是 2k-2 ,这就是最初的编号了。

v2-4e3dbc6a694b7e6b614140d2cdaccba3_b.jpg

如果 ,那么如上图所示,只需要在后面加个橙色的 就行了。

但是第一轮的时候它就被消除了,所以绿色的剩下的编号和之前偶数情况没有任何区别。所以最终的答案也是:

最后发现奇偶情况下,公式其实可以统一起来,用 n 来替换 k 就得到了:

代码

c++

        class Solution {
public:
    int lastRemaining(int n) {
        return n==1 ? 1 : 2*(n/2+1-lastRemaining(n/2));
    }
};

      

python

        class Solution:
    def lastRemaining(self, n: int) -> int:
        return 1 if n==1 else 2*(n//2+1-self.lastRemaining(n//2))
      

参考资料

[1]

LeetCode 390. 消除游戏: leetcode-cn.com/problem

[2]

韦阳的博客:【每日算法Day 74】经典面试题:约瑟夫环,我敢打赌你一定不会最后一种方法!: godweiyang.com/2020/03/

[3]

知乎专栏:【每日算法Day 74】经典面试题:约瑟夫环,我敢打赌你一定不会最后一种方法!: zhuanlan.zhihu.com/p/11

算法码上来 文章被收录于专栏

公众号「算法码上来」。godweiyang带你学习算法,不管是编程算法,还是深度学习、自然语言处理算法都一网打尽,更有各种计算机新鲜知识和你分享。别急,算法码上来。

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-27 20:15
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-29 17:30
找实习找着找着就要进入7月了,马上秋招也要开始了,找实习还有意义吗?
绝迹的星:有面就面, 没面上就当日薪4位数大佬免费培训, 面上了再考虑要不要实习
点赞 评论 收藏
分享
下个早班:秒挂就是不缺人
点赞 评论 收藏
分享
06-17 00:26
门头沟学院 Java
程序员小白条:建议换下项目,智能 AI 旅游推荐平台:https://github.com/luoye6/vue3_tourism_frontend 智能 AI 校园二手交易平台:https://github.com/luoye6/vue3_trade_frontend GPT 智能图书馆:https://github.com/luoye6/Vue_BookManageSystem 选项目要选自己能掌握的,然后最好能自己拓展的,分布式这种尽量别去写,不然你只能背八股文了,另外实习的话要多投,尤其是学历不利的情况下,多找几段实习,最好公司title大一点的
无实习如何秋招上岸
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务