62. 圆圈中最后剩下的数字

1. 描述

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

2. 例子

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

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

3. 限制

  • 1 <= n <= $10^5$
  • 1 <= m <= $10^6$

4. 题解

时间复杂度: O(n)
空间复杂度: O(1)

我们定义方程 $f(n, m)$,其意义为当数组有 n 个数字时,我们每次去除第 m 个数字,最后剩下的数字下标
所以可以看出来 $f(n, m)$ 就是我们想要的结果
当然,我们是不可能现在就知道这个方程的结果的,但是我们知道 $f(1, m)$ 的结果一定是零,因为我们要求的是最后剩下的数字坐标
而仅有一个数字时,那它自然是最后剩下的数字,而仅有一个数字时,它的坐标也必定是零
所以说,我们现在知道了 $f(1, m)$,同时我们的目标是 $f(n, m)$,所以我们需要做的是找到方程之间的递推关系
其递推关系为 $f(n, m) = (f(n - 1, m) + m) \% n$
由此,我们可以完成代码

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

		return resultIndex;
    }
};
Last updated:
Tags:
comments powered by Disqus