题目链接

LeetCode 390. 消除游戏[1]

题目描述

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

示例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]

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

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

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

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

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

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

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

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

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

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

代码

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. 消除游戏: https://leetcode-cn.com/problems/elimination-game/

[2]

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

[3]

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

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

  1. 消除左递归c++代码_【每日算法Day 85】图解算法:一行代码解决约瑟夫环的变体...

    题目链接 LeetCode 390. 消除游戏[1] 题目描述 给定一个从 到 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右 ...

  2. 【图解经典算法题】如何用一行代码解决约瑟夫环问题

    约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼. 问题描述:编号为 1-N 的 N 个 ...

  3. 一行代码解决约瑟夫问题(我要开始装B了)

    一.前言 约瑟夫问题可以说是非常经典的一道题了,面试官经常问,我有一次就遇上了它,不对,应该是它遇上了我!下面我就用一行代码来解决这道约瑟夫问题,这种方法你学会了之后就可以在面试官面前装B了. 二.解 ...

  4. 代码验证约瑟夫环百科词条中的故事(Python)——约瑟夫斯的故事、数学家加帕斯讲的故事,体验算法模板的奇妙。

    [点击此处跳转笔记正文] Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基 ...

  5. [zz]一行代码解决iframe挂马(服务器端注入、客户端ARP注入等)

    一行代码解决iframe挂马(服务器端注入.客户端ARP注入等) 一行代码解决iframe挂马(包含服务器端注入.客户端ARP注入等) 本文原创:linr@cncert.net 请转载时保留版权信息 ...

  6. 一行代码解决ie浏览器的兼容

    x-ua-compatible 头标签大小写不敏感,必须用在 head 中,必须在除 title 外的其他 meta 之前使用. 1.使用一行代码来指定浏览器使用特定的文档模式. <meta h ...

  7. 有一个List集合,里面存储了5个Student对象。Student有姓名、年龄和成绩属性,按照多个属性进行排序(一行代码解决list对象集合排序问题)。

    有一个List集合,里面存储了5个Student对象.Student有姓名.年龄和成绩属性,按照要求进行排序(一行代码解决list对象集合排序问题). 要求对List集合进行排序,排序规则是: 1.先 ...

  8. 搜索关键字变红,指定字段变色 一行代码简单集成 搜索关键字变红,Android字体变红,指定字段变红

    搜索关键字变红,指定字段变色 有时候我们搜索中的关键字需要变红或者变为别的颜色,我自己重写了textview.使用起来特别方便 使用步骤 1,把下面自定义的MyTextView 复制到项目中 impo ...

  9. python匿名基数(lamdba):给你一个整数数组nums,如果任一值在数组中出现至少两次,返回True;如果数组中每个元素互不相同,返回False,用一行代码解决

    """ 给你一个整数数组nums,如果任一值在数组中出现至少两次,返回True:如果数组中每个元素互不相同,返回False,用一行代码解决 例: nums = [1,2, ...

  10. 一个整合OkHttp 、Retrofit 、Volley 、RxJava、Novate多种开源网络框架的项目,高度的封装和集成,Android中Web网络请求一行代码解决

    一个整合OkHttp .Retrofit .Volley .RxJava.Novate多种开源网络框架的项目,高度的封装和集成,Android中Web网络请求一行代码解决 AndroidHttp 一个 ...

最新文章

  1. 详解 Tomcat 的连接数与线程池
  2. Earth to developers: Grow up!
  3. python chrome headless_Chrome Headless模式(二)——Python+selenium+headerless
  4. HDU 1402——A * B Problem Plus
  5. UIActivityIndicatorView、UIProgressView 活动与进度指示器 (实例)
  6. java等待5秒_Java并发编程-主线程等待子线程解决方案
  7. php条件语句中大括号必须,PHP条件,括号需要?
  8. retrievefile文件字节为0_linux环境下下 FTPClient.retrieveFile() 下载稍大一点的文件就卡死了-问答-阿里云开发者社区-阿里云...
  9. 对于elemnet-ui的el-upload的使用总结(移除上传文件判断,action等问题)
  10. 软考软件设计师中级考试大纲(附题型举例)
  11. HTML查看器PC,PE文件查看器(PeViewer)
  12. 关于nvme固态硬盘安装系统的一点经验
  13. Windows7下IPV6设置方法详解
  14. 《惢客创业日记》2021.01.22(周五)英雄心,狗熊命?
  15. java jstl 配置_jstl的tld配置
  16. 微信开发学习二 -- 微信开发入门(简单demo)
  17. Mac终端常用命令及报错处理
  18. 科创板发行上市审核25个监管案例汇编
  19. ARM开发(4)基于STM32的矩阵键盘按键控制TM1629A LED显示
  20. Bugku-杰瑞的下午茶

热门文章

  1. 关于CoreData的理解和使用.
  2. php 判断设备是手机还是平板还是pc
  3. Windows系统结构
  4. unslider.js 实现移动web轮播
  5. 插入数据并返回插入数据ID
  6. Unity 异步加载场景
  7. Mac os 进行Android开发笔记(1)
  8. 多继承下的super()指向的不一定是直接父类
  9. 软件工程理论、方法与实践(第三章)
  10. 为什么div设置其border无效?