zoukankan      html  css  js  c++  java
  • 60. Permutation Sequence (JAVA)

    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 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.
    • Given k will be between 1 and n! inclusive.

    Example 1:

    Input: n = 3, k = 3
    Output: "213"
    

    Example 2:

    Input: n = 4, k = 9
    Output: "2314"

    规律:在n!个排列中,除去第一位,后几位共有(n-1)!个排列,所以第一位的元素总是(n-1)!一组出现的。那么,第k行第一位的值就=nums[(k-1)/(n-1)!]。

    阶乘的下一个状态依赖上一个状态,所以可以用动态规划存储阶乘的结果。

    另外注意,JAVA中两个int数a,b除法的结果如果要保留Double,正确的写法是(Double) a/b,而不能是(Double) (a/b),后者由于先做的整数除法,返回的是截尾的整数。

    class Solution {
        public String getPermutation(int n, int k) {
            int[] dp = new int[n];
            dp[0] = 1;
            for(int i = 1; i < n; i++){
                dp[i] = i*dp[i-1]; //阶乘
            }
            
            Boolean[] flag = new Boolean[n];
            for(int i = 0; i < n; i++){
                flag[i] = false; 
            }
            
            String s = "";
            int cnt;
            int num;
            for(int i = 0; i < n ; i++){ //确定每一位的数字
                cnt = (int) Math.ceil((double) k/dp[n-i-1]); //剩余数字(flag为false)里第cnt大的那个
                k -= (cnt-1) * dp[n-i-1];
                num = 0;
                for(; cnt>0; num++){
                    if(flag[num]) continue;
                    cnt--; //flag为false计1
                }
                flag[num-1] = true;
                s += num;
            }
            return s;
        }
    }
  • 相关阅读:
    mfc窗口,父窗口parentwindow,所有者窗口ownerwindow 区别
    svn冲突问题详解 SVN版本冲突解决详解
    input的on(‘input’,function(0{})事件
    input 输入框两种改变事件的方式
    JSON格式
    AJAX的dataType问题
    什么是跨域请求?
    JSON.parse()和JSON.stringify()使用介绍
    .replace(/-/g,"/")的用法
    docker 实践(一)
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/10907902.html
Copyright © 2011-2022 走看看