zoukankan      html  css  js  c++  java
  • Permutation Sequence

    The set [1,2,3,…,n] contains a total of n! unique permutations.

    By listing and labeling all of the permutations in order,
    We get the following sequence (ie, for n = 3):

    1. "123"
    2. "132"
    3. "213"
    4. "231"
    5. "312"
    6. "321"

    Given n and k, return the kth permutation sequence.

    Note: Given n will be between 1 and 9 inclusive

    solution:开始用Permutation DP算法列出所有的情况,但是超时了,看了其他人的做法后,发现可以找规律~

    第一次做的:

    package leetcode2;
    import java.util.*;
    public class Permutationsequce {
       public static String getPermutation(int n, int k) {
            StringBuilder sb=new StringBuilder();
            StringBuilder sb1=new StringBuilder();
            int total=1;
            int[] num=new int[n];
            boolean[] visit =new  boolean[n];
            for(int i=n;i>0;i--){
                 total=total*i;
                sb1.append(i);
                num[i-1]=i;      
            }
            if(k>=total-1){
                return sb1.toString();
            }
            ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
            ArrayList<Integer> mem=new ArrayList<Integer>();
            dfs(res,mem,0,num,k,sb,visit);
            System.out.println(res);
            for(int j=0;j<res.get(k-1).size();j++){
                sb.append(res.get(k-1).get(j));
            }
            return sb.toString();
        }
    
    private static void dfs(ArrayList<ArrayList<Integer>> res,
            ArrayList<Integer> mem, int deep, int[] n, int k,StringBuilder sb,boolean[] visit) {
        // TODO Auto-generated method stub
           if(res.size()==k){       
              return;
            }
        if(deep==n.length){
            if(!res.contains(new ArrayList<Integer>(mem))){
                res.add(new ArrayList<Integer>(mem));
                sb=new StringBuilder();
                return;
            }
        }
        if(deep<n.length){        
            for(int i=0;i<n.length;i++){
                if(!visit[i]){
                mem.add(n[i]);
                visit[i]=true;
                dfs(res,mem,deep+1,n,k,sb,visit);
                mem.remove(mem.size()-1);
                visit[i]=false;
            }
        }
        }
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
     
      System.out.println(getPermutation(3,5));
    }
    
    }

    正确找规律的code:

    public String getPermutation(int n, int k) {  
        if(n<=0)  
            return "";  
        k--;  
        StringBuilder res = new StringBuilder();  
        int factorial = 1;  
        ArrayList<Integer> nums = new ArrayList<Integer>();  
        for(int i=2;i<n;i++)  
        {  
            factorial *= i;  
        }  
        for(int i=1;i<=n;i++)  
        {  
            nums.add(i);  
        }  
        int round = n-1;  
        while(round>=0)  
        {  
            int index = k/factorial;  
            k %= factorial;  
            res.append(nums.get(index));  
            nums.remove(index);  
            if(round>0)  
                factorial /= round;  
            round--;  
        }  
        return res.toString();  
    }  
  • 相关阅读:
    curl获取HTTP返回状态码
    存储过程中如何实现从数组获取数据
    ElasticsearchParseException: malformed, expected settings to start with 'object', instead was [VALUE_STRING]
    【并发编程】如果让你用三个线程循环打印ABC,你有几种写法?
    【基础】IdentityHashMap
    【基础】ThreadPoolExecutor
    【算法】快速排序
    【Java8新特性Stream】list转map
    【算法】华为南研所-括号匹配
    windows sourceTree 密码错误
  • 原文地址:https://www.cnblogs.com/joannacode/p/4419330.html
Copyright © 2011-2022 走看看