提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
剑指 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题过程
解题思路
递归或者迭代,关键是找出递推公式:
假设
f
(
n
−
1
,
m
)
=
x
f(n-1,m) = x
f(n−1,m)=x为删除了(n-1)个元素后的位置,那么删除了n个元素后的位置应该是
f
(
n
,
m
)
=
(
x
+
m
)
%
n
f(n,m)=(x + m)\%n
f(n,m)=(x+m)%n
其中,取余是为了能够循环形成圆圈。
在递归中,我们求f(n,m),f(n-1,m)…f(1,m)。其实f(1,m)一定是返回0的。
class Solution {
public int lastRemaining(int n, int m) {
if(n == 1){
return 0;
}
int x = lastRemaining(n - 1, m);
return (x + m) % n;
}
}
总结
暂时没有总结,待续。。。