stl 中的下一个排列在写一遍忘了
写个1个多小时,使用递归写的,错误就在我使用一个list保存当前剩下的数,然后利用k/(n-1)!的阶乘就是删除的数字,但进过观察,
比如 list={1,2,3}
分成3组:
1 {2,3}
2 {1,3}
3 {1,2}
确定位于哪个组,然后确定位于哪个组的第几个nyoj 511。
求第3个排列 ,3%2=1,删除 list就是第3个数3,其实呢是第2个树2 ,所以 计算方法为 (k-1)/(n-1)!
另外一个对于下一组,k%(n-1)!也不行啊, 第4个, 4%2!=0,其实应该为第二2.
这个思路和nyoj的小球下落很像(nyoj 511)
1 public class Solution { 2 3 private String ans=""; 4 public int calu(int n) 5 { 6 if(n==0) return 1; 7 int sum=1; 8 for(int i=2;i<=n;i++) 9 { 10 sum*=i; 11 } 12 return sum; 13 } 14 15 public String getPermutation(int n, int k) { 16 ArrayList<Integer> arry=new ArrayList<Integer>(); 17 for(int i=1;i<=n;i++) 18 { 19 arry.add(i); 20 } 21 22 get(k,calu(n-1),arry); 23 return ans; 24 25 } 26 public void get(int k,int n1,ArrayList<Integer> list) 27 { 28 if(list.size()==1) 29 { 30 ans+=list.remove(0); 31 return; 32 } 33 int a=list.remove((k-1)/n1); 34 ans+=a; 35 int te=k%n1; 36 if(te==0) te=n1; 37 get(te,n1/list.size(),list); 38 39 40 } 41 }
leetcode排列,求第k个排列
时间: 2024-10-21 23:42:09