链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/
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
限制:
1 <= n <= 10^5
1 <= m <= 10^6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
按照普通的做法,很明显就是做一个单向循环链表,然后再循环n-1次,最后剩下的数字就是正确答案。
第一次使用一个boolean数组记录状态,写起来复杂运行时间还很长
第二次回归到使用LinkedList,使用自带的链表,但是运行时间还是超时了。
第三次看了题解,说是ArrayList比较快,仅仅将LinkedList改到ArrayList,运行就通过了。但是时间长达1100ms
第四次仔细看题解,说是约瑟夫循环,仔细看看:
0.最后一轮循环的剩下的数字是答案A,下标是0
1.最后第二轮剩下两个数字,A的下标可以用(0 + 步长m)%当前数组长度2得知为1
2.最后第三轮,A的下标为:(1 + m) % 3 为1
可知:下标为index,步长为m,当前轮的数组长度i
index = (index + m) % i
递归的写法可以写为:f(n,m) = (f(n-1,m) + m) % length
其中f(0,m) = 0, length初始为2,表示是前一次循环的数组长度,步长为1,n为当前情况下,最后数字的下标