temptation1: 按排列数的方法写,排序方式不一样
class Solution {
public String getPermutation(int n, int k) {
int[] nums=new int[n+1];
List<String> reslist=new ArrayList<String>();
for(int i=1;i<=n;i++){
nums[i]=i;
}
backtrack(nums,1,n,reslist);
return reslist.get(k-1);
}
public void backtrack(int[] nums,int t,int n, List<String> reslist){
if(t>n){
String res="";
for(int i=1;i<=n;i++){
res+=String.valueOf(nums[i]);
}
reslist.add(res);
return;
}
for(int i=t;i<=n;i++){
swap(nums,t,i);
backtrack(nums,t+1,n,reslist);
swap(nums,t,i);
}
}
public void swap(int[] nums,int i,int j){
if(i==j)return ;
nums[i]^=nums[j];
nums[j]^=nums[i];
nums[i]^=nums[j];
}
}
temptation 2: 另一种回溯也tle了
class Solution {
public String getPermutation(int n, int k) {
int[] nums=new int[n+1];
List<List<Integer>> reslist=new ArrayList<>();
List<Integer> sublist=new ArrayList<>();
for(int i=1;i<=n;i++){
nums[i]=i;
}
backtrack(nums,1,n,reslist,sublist);
sublist=reslist.get(k-1);
String res="";
for(Integer i:sublist){
res+=String.valueOf(i);
}
return res;
}
public void backtrack(int[] nums,int t,int n, List<List<Integer>> reslist, List<Integer> sublist){
if(t>n){
reslist.add(new ArrayList<Integer>(sublist));
return;
}
for(int i=1;i<=n;i++){
if(!sublist.contains(nums[i])){
sublist.add(nums[i]);
backtrack(nums,t+1,n,reslist,sublist);
sublist.remove(sublist.size()-1);
}
}
}
}
Solution 1: math
和我的想法一样,但是我没figure out算法怎么组织
https://leetcode.com/problems/permutation-sequence/discuss/22507/“Explain-like-I’m-five”-Java-Solution-in-O(n)
class Solution {
private int[] factorial=new int[10];
public StringBuffer ans=new StringBuffer();
public String getPermutation(int n, int k) {
//把阶乘都列出来
factorial[0]=1;
for(int i=1;i<=n;i++){
factorial[i]=i*factorial[i-1];
}
List<Integer> nums=new ArrayList<>();
for(int i=1;i<=n;i++){
nums.add(i);
}
int m=n-1;
int index=0;
k--;
while(nums.size()!=0){
index=k/factorial[m];
ans.append(String.valueOf(nums.get(index)));
nums.remove(nums.get(index));
k=k-index*factorial[m];
m--;
}
return ans.toString();
}
}