每日一练【约瑟夫环问题】
孩子们的游戏
约瑟夫环问题,解法有很多,比如环形链表,数组。递归,递推,动态规划。不过整体其实就分为两类,模拟和重复子问题类的问题。
下面我们先使用环形链表和数组进行模拟完成。
使用链表,构造环形链表。计数,当每取到m时,删除该节点。最后,剩下的就是最后一个孩子。
使用数组,通过%完成数组的环形遍历,通过令加一个Bool数组完成对已删除孩子的标记
动态规划:
dp[i]:表示从前i个孩子中围成一圈,最后获胜孩子的编号。
我们发现dp[i]和dp[i-1]所表示的含义是一样的。最后无非就是下标映射的关系,可以自行推导一下。
为了保证+m编号不会超过n,这里%n。
代码:
int LastRemaining_Solution(int n, int m) {int f = 0;for (int i = 2; i <= n; i++)f = (f + m) % i;return f;}