[leetcode]60. Permutation Sequence

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();
    }
    
  
}

猜你喜欢

转载自blog.csdn.net/weixin_36869329/article/details/85208383