All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0001_0100.s0060_permutation_sequence.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0001_0100.s0060_permutation_sequence;

// #Hard #Math #Recursion #2023_08_11_Time_0_ms_(100.00%)_Space_40.2_MB_(52.90%)

/**
 * 60 - Permutation Sequence\.
 *
 * Hard
 *
 * 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.
 *
 * **Example 1:**
 *
 * **Input:** n = 3, k = 3
 *
 * **Output:** "213" 
 *
 * **Example 2:**
 *
 * **Input:** n = 4, k = 9
 *
 * **Output:** "2314" 
 *
 * **Example 3:**
 *
 * **Input:** n = 3, k = 1
 *
 * **Output:** "123" 
 *
 * **Constraints:**
 *
 * *   `1 <= n <= 9`
 * *   `1 <= k <= n!`
**/
public class Solution {
    public String getPermutation(int n, int k) {
        char[] res = new char[n];
        // We want the permutation sequence to be zero-indexed
        k = k - 1;
        // The set bits indicate the available digits
        int a = (1 << n) - 1;
        int m = 1;
        for (int i = 2; i < n; i++) {
            // m = (n - 1)!
            m *= i;
        }
        for (int i = 0; i < n; i++) {
            int b = a;
            for (int j = 0; j < k / m; j++) {
                b &= b - 1;
            }
            // b is the bit corresponding to the digit we want
            b &= ~b + 1;
            res[i] = (char) ('1' + Integer.bitCount(b - 1));
            // Remove b from the set of available digits
            a &= ~b;
            k %= m;
            m /= Math.max(1, n - i - 1);
        }
        return String.valueOf(res);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy