给一个长度为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 ; LinkedListlist = 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 ; }}
新闻热点
疑难解答