约瑟夫环

来源:互联网 发布:html5编程软件 编辑:程序博客网 时间:2024/05/29 05:55

给一个长度为n的环,从编号为0的节点开始数,数到m-1时移除该节点,问最终剩下节点的编号

方法一:直接模拟链表移除

import java.util.LinkedList;import java.util.List;public class Solution {public int LastRemaining_Solution(int n, int m) {        if(m==0)return -1 ;         LinkedList list = new LinkedList() ;         for(int i = 0;i < n;i++){            list.add(i) ;         }        int pos = 0;         for(int i = 0;i < n-1;i++){            int len = (n-i) ;             pos = (pos+m-1)%len   ;             list.remove(pos) ;         }        return list.get(0) ; }}

对于长度为n的环,其第一个移除的节点为(m-1)%n点,
那么其下一个节点的编号为k=m%n,以其下一个节点开始的节点编号为
k,k+1,k+2....n-2,n-1,0,1....k-2
剩下的n-1个节点可以看成一个新的约瑟夫环,
0,1,2.......................n-2
设新的约瑟夫环中求得的最终结果为x,
可以很明显地可以看到x在原来的约瑟夫环中的坐标为(x+k)%n
可以得到递推公式为f(n)=(f(n-1)+m)%n
其中f(n)为n个约瑟夫环的值

public class Solution {     public int LastRemaining_Solution(int n, int m) {        if(m==0)return -1 ;         if(n==0)return 0 ;         return (LastRemaining_Solution(n-1,m)+m)%n ;     }}
0 0
原创粉丝点击