給一個長度為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 ; }}
新聞熱點
疑難解答