[剑指 Offer 62]圆圈中最后剩下的数字(约瑟夫环问题:动态规划)
创始人
2024-03-03 14:25:52
0

[剑指 Offer 62]圆圈中最后剩下的数字(约瑟夫环问题:动态规划)

题目:

  • 0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。

  • 例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

示例 1:输入: n = 5, m = 3
输出: 3示例 2:输入: n = 10, m = 17
输出: 2

思路:

约瑟夫环:动态规划,采用数学推导出转移方程

  • 对于[n, m问题],首轮删除环中第m个数字后,得到一个长度为 n - 1 的数字环。

  • 由于有可能 m > n,因此删除的数字为 (m - 1) % n,删除后的数字环从下个数字(即m % n)开始,

  • 设 t = m % n,可得"新数字环"在"旧数字环"中的对应下标为: 【 t,t+1,t+2,…,0,1,…,t-3,t- 2 】(t-1为被删除的数字)

  • 旧环删除数字 nums[(m-1)%n] 后的新环的起始下标为 旧环中的 m % n = t

  • 删除一轮后的数字环变为[n-1,m问题],其数字下标对应关系如下:

	      新环下标(本环)    新环下标在旧环(上环)下标中对应的下标0                      (t+0)%n1                      (t+1)%n...                      ...n-2                     (t+n-2)%n
  • 所以新环中的下标 x 与在旧环中对应下标 X 的关系为 X = (t + x) % n
  • 删除到最后的新环中只有一个元素,下标为0,可以通过下标递推关系 找出其在"最旧环"中的下标
 X = (t + x) % n   --->  f(X) = (t + f(X - 1)) % n         (f(X - 1)为旧环下标,f(X)为旧环在其"上一层"新环中对应的下标)--->       = (m % n + f(X - 1)) % n--->       = (m + f(X - 1)) % n         (m % n % n == m % n)
  • 最终的环,只有一个元素,下标为 0
  • 推导最终环的上一个环,有两个元素…
  • 再到上一个环,有三个元素,直到推到最原始的 n 个元素的环

代码:

class Solution {public int lastRemaining(int n, int m) {int x = 0;for (int i = 2; i <= n; i++) {x = (x + m) % i;}return x;}
}

相关内容

热门资讯

汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...