Created
April 27, 2018 01:49
-
-
Save mk100120/2abd677a15a431b7e28b5128022d6d06 to your computer and use it in GitHub Desktop.
一道关于约瑟夫环的算法题解法;
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| http://zhedahht.blog.163.com/blog/static/2541117420072250322938/ | |
| [递归方法]: | |
| class Solution { | |
| public: | |
| int LastRemaining_Solution(unsigned int n, unsigned int m) | |
| { | |
| if(n==0) | |
| return -1; | |
| if(n==1) | |
| return 0; | |
| else | |
| return (LastRemaining_Solution(n-1,m)+m)%n; | |
| } | |
| }; | |
| [DP方法]: | |
| 链接:https://www.nowcoder.com/questionTerminal/f78a359491e64a50bce2d89cff857eb6?toCommentId=96023 | |
| 来源:牛客网 | |
| class Solution { | |
| /* | |
| 参考剑指offer,纯手打 | |
| 定义一个关于m 和n的方程,f(n,m),表示n个数字0,1,2,….n-1; | |
| 中每次删除第m个数字最后剩下的数字。 | |
| 第一个被删除的数字(m-1)%n. | |
| 例如0,1,2,3,4,5,删除第3个,即2,那么(3-1)%6=0….2,商0余2,所以2就是那个被删除的数。 | |
| 在删除第m个数字(定义为k)之后的序列为 | |
| 0,1,2,…k-1,k+1,…n-1; | |
| 在进入下一次循环时删除第m个的时候从第k+1个数开始,这个序列为k+1,,,n-1,0,1,…k-1;函数因此定为f*(n-1,m) | |
| 再将这个映射我从0开始的序列,如下: | |
| K+1 → 0; | |
| K+2 → 1; | |
| … | |
| n-1 → n-1-(k+1)=n-k-2; | |
| 0 → n-k-2+1=n-k-1; | |
| 1 → n-k; | |
| … | |
| k-1 → n-k-1+(k-1)=n-2; | |
| 映射p(x)=p(x-k-1)%n;表示映射钱的数字是x,映射后的数字是x-k-1。逆映射为 | |
| P*(x)=(x+k+1)%n. | |
| 这里记住无论循环多少次删除第m个元素最后剩下的数字是一样的。 | |
| 有f*(n-1,m)=P*( f(n-1,m))=( f(n-1,m)+k+1)%n.=(f(n-1,m)+m)%n. | |
| 因为k=(m-1)%n=(m-1) | |
| */ | |
| public: | |
| int LastRemaining_Solution(int n, int m) | |
| { | |
| if(n<1||m<1) | |
| return -1; | |
| int last=0; | |
| for(int i=2;i<=n;i++) | |
| last=(last+m)%i; | |
| return last; | |
| } | |
| }; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment