最后只剩下一个元素,假设最后的这一个元素为 num, 该元素最终的下标一定是 0。 反推过程: (当前index + m) % 上一轮剩余的个数 */ public: intLastRemaining_Solution(int n, int m){ if (n <= 0 || m < 0) return-1;
int res = 0; // 最后一轮剩下2个人,开始反推 for (int i = 2; i <= n; i ++) { res = (res + m) % i; } return res; } };
/* 递归实现 圆圈长度为 n 的解可以作为长度为 n-1 的解再加上报数的长度 m。 因为是圆,最后需要对 n 取余。 */ classSolution { public: intLastRemaining_Solution(int n, int m){ if (n == 0) return-1; if (n == 1) return0;
return (LastRemaining_Solution(n - 1, m) + m) % n; } };