LeetCode:面试题62:圆圈最后剩下的数字

链接: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为当前情况下,最后数字的下标

你可能感兴趣的:(每日打卡)