当前位置: 首页 > news >正文

深入解析:LeetCode 390 消除游戏

深入解析:LeetCode 390 消除游戏

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 代码细节解释
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

在算法题中,经常会遇到一些“模拟类”的题目:一开始我们会忍不住想直接照步骤一步步操作,但很快就会发现这种方式效率低得吓人。这道 LeetCode 390 消除游戏就是典型的例子。表面上是数组模拟,但实际上考的是 数学规律

本文会先介绍题目,然后分析解法,最后带上完整的 Swift Demo 和测试。

描述

题目的规则是这样的:

  1. 我们有一个从 1 到 n 的递增数组。
  2. 第一步,从左往右删除第一个数,然后每隔一个数删除一个,直到结尾。
  3. 第二步,从右往左,同样删除第一个(最右边的数),然后每隔一个数删除一个。
  4. 不断重复这两个步骤,直到数组只剩下一个数。

题目让我们返回最后剩下的那个数。

举个例子:

题解答案

如果你尝试直接用数组去模拟这个过程,很快就会发现效率问题。因为 n 最大能到 10^9,数组模拟完全不现实。

更好的办法是:找规律,直接数学递推

我们发现:

  • 每一轮操作后,剩下的数依然是一个等差数列。

  • 关键是维护三个变量:

    1. 当前的 头元素 head
    2. 当前的 步长 step(每轮会翻倍)
    3. 当前的 剩余元素个数 n
  • 每次从左往右时,head 一定会更新;从右往左时,只有在元素个数是奇数时 head 才会更新。

最后,当 n 缩小到 1 时,head 就是答案。

题解代码分析

下面是 Swift 的实现:

import Foundation
class Solution {
func lastRemaining(_ n: Int) -> Int {
var leftToRight = true
var remaining = n
var step = 1
var head = 1
while remaining > 1 {
// 从左到右,head 一定会更新
// 从右到左,只有当剩余是奇数时 head 才会更新
if leftToRight || remaining % 2 == 1 {
head += step
}
remaining /= 2
step *= 2
leftToRight.toggle()
}
return head
}
}

代码细节解释

  1. head:代表当前数组的第一个数字。初始是 1。

  2. step:代表相邻数字的间隔,初始为 1。每一轮删除一半数字,step 就要翻倍。

  3. remaining:剩余元素的个数,每一轮都除以 2。

  4. leftToRight:布尔值,记录方向。每一轮切换一次。

  5. head 更新条件:

    • 如果是从左往右,必然更新;
    • 如果是从右往左,只有 remaining 是奇数时才更新。

这样就避免了真实的数组操作,复杂度大幅度下降。

示例测试及结果

我们来跑几个例子:

let solution = Solution()
print(solution.lastRemaining(9))   // 输出: 6
print(solution.lastRemaining(1))   // 输出: 1
print(solution.lastRemaining(10))  // 输出: 8
print(solution.lastRemaining(24))  // 输出: 14

运行结果:

  • 输入 9 → 输出 6
  • 输入 1 → 输出 1
  • 输入 10 → 输出 8
  • 输入 24 → 输出 14

完全符合预期。

时间复杂度

每一轮都会把剩余的数字减半,所以循环次数大约是 log(n)
因此时间复杂度是 O(log n)

空间复杂度

我们只用了常数个变量 (head, step, remaining, leftToRight),所以空间复杂度是 O(1)

总结

这道题的精髓就是 不要真的去模拟数组操作,而是用数学规律来迭代推导。

  • 每一轮剩下的数依然是等差数列;
  • 我们只要跟踪 head 的变化,就能在 O(log n) 的时间里解出结果;
  • 这种思路在处理大规模数据时非常有用,避免了不必要的存储和计算。

换句话说,这是一道“数学建模 + 算法优化”的典型题。学会这个技巧,类似的问题就能迎刃而解。

http://www.hskmm.com/?act=detail&tid=38760

相关文章:

  • 2025年暖风机评测:五款口碑机型横向对比与推荐
  • 一个关于cos的极限
  • 感知节点@8@ ESP32+arduino+ 第六个程序 读取射频卡卡号
  • Ai元人文:共识锚定
  • P14304 【MX-J27-T1】分块
  • 实现安卓scrollview里的多个按钮实现的每个按钮单选功能
  • ABP - 懒加载 [ILazyServiceProvider、DefaultLazyServiceProvider、LazyServiceProvider]
  • 三角函数的2倍角公式
  • FFmpeg开发笔记(八十五)基于PyQt和FFmpeg的开源视频剪辑器OpenShot
  • 2025年服装厂家推荐排行榜:棒球帽,卫衣,羽绒服,春秋季运动休闲服饰源头厂家精选
  • 2025女丘
  • 2025年上海久宙集团:深度解析其技术护城河与行业话语权
  • Go 的跨平台编译详解 - 指南
  • netcore vue grpc、http grpc
  • 墨尔本迎来第六届PancakesCon网络安全大会
  • 实验三
  • 2025年河北中医理疗针灸培训学校权威推荐榜单:中医针灸技术培训/中医推拿针灸培训/针灸正骨培训学校精选
  • 2025年工业冷水机厂家权威推荐榜:专业制冷技术与高效节能解决方案深度解析
  • 兼职帮农业公司搭建外贸出海网站(赚了900元)
  • 2025 年防冻液源头厂家最新推荐口碑排行榜:严检合格技术为先,实力企业权威甄选食品级/空气能专用/长效防冻液公司推荐
  • 2025年南京机械钻井工程服务权威推荐榜单:打井工程/打桩工程/环保检测井工程源头公司精选
  • 深入解析:使用 PyTorch 实现 CIFAR-10 图像分类:从数据加载到模型训练全流程
  • 2025 年冷藏车厂家最新推荐排行榜:结合协会测评权威数据,详解优质品牌特点与选购指南 9.6 米 / 解放 / 4.2 米 / 福田 / 小型冷藏车公司推荐
  • 2025 年铣边机源头厂家最新推荐排行榜:含钢板 / 平板 / 板材 / 自走式 / 全自动铣边机机型,结合协会测评数据甄选实力企业
  • 2025 年载冷剂厂家推荐排行榜:无醇/安全型/SH-4/SH-5A/多元醇/高低温/超低温/乙二醇/冷库专用/食品级载冷剂公司推荐
  • 2025年盐趣科研教育深度解析:从录取数据到成果落地的全链路拆解
  • 2025年盐趣科研教育深度解析:从“科研背景”维度拆解留学突围路径
  • 2025 年房屋改造公司最新推荐榜,聚焦企业服务能力与市场口碑深度解析老房 / 旧房 / 局部 / 小户型 / 出租房房屋改造推荐
  • 2025 年桥梁防撞护栏优质厂家最新推荐榜:涵盖锌钢 / ZF01/Q235/Q355B / 景观 / 灯光 / 河道 / 公路 / 喷塑等类型,全方位解析实力企业
  • kali wsl桌面使用