这篇文章主要介绍了LeetCode如何求圆圈中最后剩下的数字,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
0,1,,n-1 这 n 个数字排成一个圆圈,从数字 0 开始,每次从这个圆圈里删除第 m 个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4 这 5 个数字组成一个圆圈,从数字 0 开始每次删除第 3 个数字,则删除的前 4 个数字依次是 2、0、4、1,因此最后剩下的数字是 3。
输入: n = 5, m = 3
输出: 3
输入: n = 10, m = 17
输出: 2
dp[n, m]
是 n 个数字时每次删除第 m 个数字的最后剩下数字的下标(m-1)%n
, 而其下一个下标 i+1 为下一次删除的起点y = (x+i+1)%n
, 而 i 为
(m-1)%n
, 所以可以进一步得到
y = (x+m)%n
dp[n-1,m]
, 这个是映射下标, 根据上面的下标转换关系, 反推出原下标就是
(dp[n-1,m]+m)%n
dp[n, m] = (dp[n-1,m]+m)%n
, 这就是最核心的状态转移方程class Solution:
def lastRemaining(self, n: int, m: int) -> int:
# 初始dp[1,m]为0
dp = 0
for x in range(2, n + 1):
# 对应公式dp[x,m] = (dp[x-1,m] + m) % x
dp = (dp + m) % x
return dp
感谢你能够认真阅读完这篇文章,希望小编分享的“LeetCode如何求圆圈中最后剩下的数字”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。