题目

原题目地址传送

难度:中等

思路

这道题,一上来肯定很多人都在想直接按照题目的意思开始操作,构建一个集合,然后正着遍历,删除1、3、5… 然后倒着遍历,删除删除1、3、5… 这样做当然是可以的,但是可能会超时。

其实,我们主要想获取的元素,就是最后剩下的那一个元素,这个元素最后必然是数组中唯一的一个元素,并且索引值为0,我们只需要跟随着删除的步伐,不断的确定下一次删除操作,数组中剩余的那个起始元素是什么就好了,直到数组中只剩下一个元素,就把这个元素返回就好了。

(这里我们把一次整体的删除操作叫做一次删除,就比如[1、2、3、4、5、6] 删除之后[2、4、6],这叫一次删除操作)

我们拿数组[1、2、3、4、5、6] 举例,刚开始首个元素是1,第一次删除操作之后数据的样子应该是[2、4、6],这时候有两个信息,每经过一次删除之后,步长 * 2,元素的个数 / 2([2、4、6]删除之后会变成[4] ,3 / 2 = 1),所以我们只需要两个变量记录下来其实的首个元素值1,每次删除之后,算出新的起始元素即可。

算出新的起始元素有两种情况:

  • 这一次是从左边开始删除,那么原来的第一个元素必然被删除掉,新的起始元素必然是上一次删除的下一个元素,[1、2、3、4、5、6] 删除完成之后,第一个元素元素必然是1的下一个元素2.
  • 这一次是从右边删除,那么就要看目前剩下的元素数量了,如果了奇数个比如[2、4、6],那么删除过后就是[4],我们所需要的删除过后的第一个元素就是原第一个元素的下一个元素。但是如果是偶数个[2、4、6、8],那么删除之后就是[2、6],原有的第一个元素删除之后还是第一个元素,就不用变。

代码

class Solution {public int lastRemaining(int n) {if (n < 1) {return -1; }int result = 1;// step代表相邻的两个元素之间相差的步长,count代表目前的元素个数是多少。int step = 1, count = n;boolean left = true;while (count > 1) {if (left || (count & 1) == 1) {// 左边开始或者右边开始并且剩下的元素个数为奇数个,起始元素要变成当前起始元素的的下一个result += step;}// 每次步长会 * 2step <<= 1;// 每次元素的个数会缩减 / 2count >>= 1;left = !left;}return result;}
}

时间复杂度时间复杂度:O(logn),其中 n 为初始整数列表的元素数目。每次删除都会将元素数目减半,所以时间复杂度为 O(logn)。

空间复杂度:O(1)。只需要使用常数的额外空间。

刷穿力扣 | 390. 消除游戏相关推荐

  1. 力扣174. 地下城游戏

    力扣174. 地下城游戏 文章目录 力扣174. 地下城游戏 一.题目描述 二.分析 三.完整代码 一.题目描述 二.分析 这个题一看就可以用动态规划,就需要确定动态规划的状态和选择以及状态转移方程 ...

  2. 【手把手带你刷Leetcode力扣】10.数据结构 -图

    图: 顶点 邻居节点 边 度:边的数量 无向图 有向图 入度:指向该顶点的边的数量 出度:以该顶点为起点指向别的顶点的边的数量 权重图 最短路径 贝尔曼-福特算法(Bellman-Ford) 迪克斯特 ...

  3. LeetCode55跳跃游戏//力扣55跳跃游戏(贪心)

    LeetCode55跳跃游戏//力扣55跳跃游戏(贪心) 来源:力扣(LeetCode) 链接:题目跳转 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该 ...

  4. LeetCode:390. 消除游戏————中等

    题目 390. 消除游戏 列表 arr 由在范围 [1, n] 中的所有整数组成,并按严格递增排序.请你对 arr 应用下述算法: 从左到右,删除第一个数字,然后每隔一个数字删除一个,直到到达列表末尾 ...

  5. Java实现 LeetCode 390 消除游戏

    390. 消除游戏 给定一个从1 到 n 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右到左,从倒数第一个数字开始,每隔一个数 ...

  6. [LeetCode]390.消除游戏

    [LeetCode]390.消除游戏 题目 示例 方法 模拟 题目 列表 arr 由在范围 [1, n] 中的所有整数组成,并按严格递增排序.请你对 arr 应用下述算法: 从左到右,删除第一个数字, ...

  7. LeetCode 390. 消除游戏

    ​​​​​​390. 消除游戏 给定一个从1 到 n 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右到左,从倒数第一个数字开始 ...

  8. 390. 消除游戏(约瑟夫环)

    390. 消除游戏 列表 arr 由在范围 [1, n]中的所有整数组成,并按严格递增排序.请你对 arr 应用下述算法: 从左到右,删除第一个数字,然后每隔一个数字删除一个,直到到达列表末尾. 重复 ...

  9. 力扣——174.地下城游戏(困难难度)——万能的递归与动态分析

    力扣--174. 地下城游戏 一.算法目录合集 1.地址 2.说明 二.题目说明 1.题干 2.原地址 三.实现步骤 1.思路分析 1.1.分析问题 1.2.具体步骤 ① 特殊情况分析 ② 常规分析 ...

最新文章

  1. python2的input,关于python2.x input函数的安全隐患
  2. python json dumps 自定义_Python json.dumps 自定义序列化操作
  3. 管中窥豹,物联网之我见
  4. labelme标注文件转coco json,coco json转yolo txt格式,coco json转xml, labelme标注文件转分割,boxes转labelme json
  5. HOOK API(三)—— HOOK 所有程序的 MessageBox
  6. html设置css字体样式表,HTML 学习笔记 CSS样式(字体)
  7. CentOs安装pyhive
  8. 采用 KMP 算法编程实现病毒感染检测算法
  9. Red Hat 9.0 安装配置 zz
  10. 国仁猫哥:视频号超详细运营攻略教程;教你如何打造一个优质的视频号【建议收藏】
  11. 基于vue,解决打开新窗口被浏览器拦截的问题
  12. 51单片机实现万年历
  13. net中c#教程 如何创建、合并、下载、打印pdf文件?
  14. ros2 launch 常见问题
  15. Python爬虫:使用线程池快速下载视频
  16. 在word文档中如何插入Mathtype公式
  17. 如何给女朋友解释为什么200M宽带,打王者荣耀还是会有460ms的延迟?
  18. 2021年起重机司机(限桥式起重机)最新解析及起重机司机(限桥式起重机)新版试题
  19. 无人机巡检,风力发电机组表面缺陷检测数据集(YOLO标签)
  20. Java UDP Server的轻量级实现

热门文章

  1. 宏基Acer台式机 win8 改win7 按F12没有U盘启动选项
  2. 安装两个Eclipse 版本不一致,高版本无法打开
  3. 什么是免费ARP-看这篇就够了
  4. Tomcat服务器简介
  5. 微信支付:chooseWXPay:fail, the permission value is offline verifying
  6. 爆笑中的商业哲理:怎么娶比尔·盖次的女儿!
  7. python2 requests模块_python requests模块详解
  8. 如何关闭win7的ps/2兼容鼠标(触屏版)
  9. 题解:魔法少女(动态规划超简单)
  10. 学习说话人识别和验证的判别特征