从零学算法(LCR 187. 破冰游戏)

社团共有 num 为成员参与破冰游戏,编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target,从 0 号成员起开始计数,排在第 target 位的成员离开圆桌,且成员离开后从下一个成员开始计数。请返回游戏结束时最后一位成员的编号。

示例 1:

输入:num = 7, target = 4

输出:1

示例 2:

输入:num = 12, target = 5

输出:0

  • 我最后挣扎着理解一下:假设有 n 个人,每轮出局第 m 个人,我们把最终剩下的人的解定义为f(n),我们同时表示一下这个环为 0,1,2...n-2,n-1,而 f(n-1) 就是 0,1,2...n-3,n-2 的环每次出局第 m 个人。接下来试着找一下联系,当 f(n) 的环经过一轮删除后,由于 m 可能大于 n,所以实际上删除了环上 (m-1)%n 位上的数,它的下一位是 (m-1)%n + 1 = m%n - 1%n + 1 = m%n,(n 要是等于 1 你还找什么,所以 1%n 必定为 1),我们把 m%n 看做 t,删除的那位就是前一位即 t-1,此时的环可以用 t 表示成 t,t+1...0,1,...t-3,t-2,f(n) 删除一轮,不就变成了 f(n-1) 的问题了吗,那么我们一一对照 f(n-1) 的环和我们用 t 表示的 f(n) 删除一轮后的环
  • 其实我们就找到了 f(n) 与 f(n-1) 之间的联系,假设 f(n-1) 的环上某个数字为 x,他可以递推得到 f(n) 删除后的环上对应的 x 为 (x+t)%n
  • 或者说,知道 f(n-1),我们就知道了 f(n),我们带入 f(n) 和 f(n-1),可以得到 f(n)=(f(n−1)+t)%n,把 t 还原成 m%n,你就得到了 f(n)=(f(n−1)+m)%n,我们知道了状态定义和状态转移方程,还剩初始值,n 为 1,那最终剩下的恒为 0,即 dp[0] = 0,毕竟都不需要删除了,由于下一步的值只和上一步相关,所以也不需要定义 dp 数组了,用一个值滚动更新即可
java 复制代码
  public int lastRemaining(int n, int m) {
  	  // f(1)
      int x = 0;
      // i 从 2 开始不断得到 f(2),f(3)...最终的 f(n)
      for (int i = 2; i <= n; i++) {
          x = (x + m) % i;
      }
      return x;
  }
相关推荐
Xの哲學30 分钟前
Perf使用详解
linux·网络·网络协议·算法·架构
想不明白的过度思考者40 分钟前
数据结构(排序篇)——七大排序算法奇幻之旅:从扑克牌到百亿数据的魔法整理术
数据结构·算法·排序算法
小七rrrrr1 小时前
动态规划法 - 53. 最大子数组和
java·算法·动态规划
code小毛孩1 小时前
leetcodehot100 矩阵置零
算法
何妨重温wdys1 小时前
矩阵链相乘的最少乘法次数(动态规划解法)
c++·算法·矩阵·动态规划
姜不吃葱1 小时前
【力扣热题100】双指针—— 接雨水
数据结构·算法·leetcode·力扣热题100
PineappleCoder1 小时前
大小写 + 标点全搞定!JS 如何精准统计单词频率?
前端·javascript·算法
tanyongxi662 小时前
C++ 特殊类设计与单例模式解析
java·开发语言·数据结构·c++·算法·单例模式
qq_513970442 小时前
力扣 hot100 Day76
算法·leetcode·职场和发展
Moshow郑锴3 小时前
机器学习相关算法:回溯算法 贪心算法 回归算法(线性回归) 算法超参数 多项式时间 朴素贝叶斯分类算法
算法·机器学习·回归