https://leetcode.cn/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/description/

社团共有 num 位成员参与破冰游戏,编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target,从 0 号成员起开始计数,排在第 target 位的成员离开圆桌,且成员离开后从下一个成员开始计数。请返回游戏结束时最后一位成员的编号。

示例 1:

输入:num = 7, target = 4
输出:1

示例 2:

输入:num = 12, target = 5
输出:0

提示:

0 1 2 3 4 5 6

0 1 2 4 5 6

1 2 4 5 6

1 2 4 6

1 2 6

1 2

1

方法一:数学 + 递归 思路

题目中的要求可以表述为:给定一个长度为 num 的序列,每次向后数 target 个元素并删除,那么最终留下的是第几个元素?

这个问题很难快速给出答案。但是同时也要看到,这个问题似乎有拆分为较小子问题的潜质:如果我们知道对于一个长度 num - 1 的序列,留下的是第几个元素,那么我们就可以由此计算出长度为 num 的序列的答案。

算法

我们将上述问题建模为函数 f(num, target),该函数的返回值为最终留下的元素的序号。

首先,长度为 num 的序列会先删除第 target % num 个元素,然后剩下一个长度为 num - 1 的序列。那么,我们可以递归地求解 f(num - 1, target),就可以知道对于剩下的 num - 1 个元素,最终会留下第几个元素,我们设答案为 x = f(num - 1, target)。