约瑟夫环
介绍
约瑟夫环(Josephus Problem)是一个理论计算机科学中的经典问题,也是一个著名的数学游戏问题。故事背景多种多样,但基本情节大致如下:有一群人围成一个圈,从某个人开始报数,每次数到特定数值(比如说是m)的人会被排除出圈,然后从下一个人继续开始报数,直到只剩下最后一个人为止,这个人就是游戏的胜利者。
解决约瑟夫环问题可以用递归、迭代或者数学公式等多种方法。
题目:
孩子们的游戏
递归法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class Solution { private int function(int n, int m) { if (n == 1) return 0; int x = function(n - 1, m); return (m + x) % n; } public int LastRemaining_Solution(int n, int m) { if(n == 0 || m == 0) return -1; return function(n, m); } }
|
优点:简洁
缺点:会出现栈溢出
递归法解析:
LCR 187. 破冰游戏 - 力扣(LeetCode)
迭代法
1 2 3 4 5 6 7 8 9 10 11 12
| public class Solution { public int LastRemaining_Solution(int n, int m) { if(n == 0 || m == 0) return -1; int x = 0; for(int i = 2; i <= n; i++) x = (m + x) % i; return x; } }
|
优点:效率高
缺点:有难度
迭代法解析:
https://blog.csdn.net/u011500062/article/details/72855826