import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @param m int整型 * @return int整型 */ public int LastRemaining_Solution (int n, int m) { // write code here if(n <= 0 || m <= 0){ return 0; } return find(n, m); } public int find(int n, int m){ if(n == 1){ return 0; } return (find(n - 1, m) + m)%n; } }
约瑟夫环问题,关键是理解公式
1、定义函数f(n, m) 的结果返回最后剩余孩子的下标。所以当n == 1, 则剩下的孩子下标就是0。f(1,m) = 0。
2、找到 f(n,m) 和 f(n-1, m) 之间的关系。
f(n,m) 移除一个小孩之后,问题其实就变成了n-1个孩子,每m个孩子减少一个的问题也就是f(n-1,m),唯一的区别是f(n-1,m)返回的下标不是我们的原f(n,m)所对应的下标。可以认为不是原数组对应的下标。那其实这个下标差值就是m,既假设f(n-1,m)返回的下标是1,其实是原下标的m+1,所以下标要加m。