`

Leetcode - Permutation Sequence

 
阅读更多
原题链接:https://leetcode.com/problems/permutation-sequence/
[分析]
思路1:调用 k 次NextPermutation.
思路2:数学解法,在n!排列中,每个第一位元素带领 (n-1)! 个排列数,假设 p = k / (n-1)!,则num[p]就是第一位上的数字,注意 k 要从0开始计数,因此进主循环前k--。
类似的方法求出剩下位置的数字。参考:
http://blog.csdn.net/doc_sgl/article/details/12840715
http://m.blog.csdn.net/blog/linhuanmars/22028697

public class Solution {
    public String getPermutation(int n, int k) {
        if (n <= 0 || n > 9)
            return "";
        int[] num = new int[n];
        for (int i = 0; i < n; i++)
            num[i] = i + 1;
        int factorial = 1;
        for (int i = 2; i <= n; i++)
            factorial *= i;
        StringBuilder result = new StringBuilder(n);
        k--;
        for (int i = 0; i < n; i++) {
            factorial /= n - i;
            int selectIdx = k / factorial;
            result.append(num[selectIdx]);
            k %= factorial;
            for (int j = selectIdx; j < n - i - 1; j++)
                num[j] = num[j + 1];
        }
        return result.toString();
    }
    public String getPermutation1(int n, int k) {
        if (n <= 0 || n > 9)
            return "";
        int[] num = new int[n];
        for (int i = 0; i < n; i++)
            num[i] = i + 1;
        for (int i = 1; i < k; i++)
            nextPermutation(num);
        StringBuilder result = new StringBuilder(n);
        for (int i = 0; i < n; i++)
            result.append(num[i]);
        return result.toString();
    }
    public void nextPermutation(int[] num) {
        int p = num.length - 2;
        while (p >= 0 && num[p] >= num[p + 1])
            p--;
        if (p >= 0) {
            int q = p + 1;
            while (q < num.length && num[q] > num[p])
                q++;
            int tmp = num[--q];
            num[q] = num[p];
            num[p] = tmp;
        }
        int q = num.length - 1;
        p = p + 1;
        while (p < q) {
            int tmp = num[p];
            num[p] = num[q];
            num[q] = tmp;
            p++;
            q--;
        }
    }
}
分享到:
评论

相关推荐

    js-leetcode题解之60-permutation-sequence.js

    js js_leetcode题解之60-permutation-sequence.js

    java-leetcode题解之Permutation Sequence.java

    java java_leetcode题解之Permutation Sequence.java

    leetcode-cpp刷题

    - **2.1.13 Permutation Sequence** - 给定数字集合,返回第n个排列。 - 实现思路:利用数学方法计算出每一位上的数字。 - **2.1.14 Valid Sudoku** - 判断给定的数独是否有效。 - 实现思路:分别检查行、列和...

    LeetCode最全代码

    # [LeetCode](https://leetcode.com/problemset/algorithms/) !... Up to date (2016-12-18), there are `447` Algorithms / `13` ...31 | [Next Permutation](https://leetcode.com/problems/next-permutation/)| ...

    lrucacheleetcode-LeetCode:这个库用于总结leetcode中遇到的习题,期望按照数据结构和常用方法分成2类,进行总结,

    leetcode LeetCode 这个库用于总结leetcode中遇到的习题 常用数据结构习题总结 1.线性表 解决进度 No. Describition mark 1 Remove Duplicates from Sorted Array 2 Remove Duplicates from Sorted Array II 3 ...

    leetcode代码200题c++

    1. **Permutation Sequence**:这个问题涉及到排列组合和字符串操作。它要求生成一个给定整数n的所有可能排列的序列。这通常需要对数字进行位操作或使用回溯法。 2. **First Missing Positive**:这是一个关于数组...

    c++-c++编程基础之leetcode题解第60题排列序列.zip

    LeetCode的第60题,也称为"排列序列"(Permutation Sequence),要求我们给定一个整数n,生成所有可能的n个数字的排列,并按照字典序排序。例如,当n=3时,排列序列应该是"123", "132", "213", "231", "312", "321...

    Coding Interview In Java

    236 Permutation Sequence 573 237 Generate Parentheses 575 238 Combination Sum 577 239 Combination Sum II 579 240 Combination Sum III 581 241 Combinations 583 242 Letter Combinations of a Phone Number ...

    leetcode_basic_60

    这个“leetcode_basic_60”主题可能聚焦于LeetCode上的第60题,即“Permutation Sequence”(排列序列)。这个问题涉及到组合数学、递归和字符串处理,是Python编程者常见的练习题目。 【描述】"leetcode_basic_60...

    javalruleetcode-SDE-Problems:标准SDE问题列表

    leetcode SDE-问题 标准 SDE 问题列表 第一天:(数组) 日 问题陈述 解决方案 困难 使用的数据结构 使用的算法 时间复杂度 空间复杂度 补充阅读 在 N 个整数的数组中查找重复项 中等的 大批 不适用 上) O(1) 在不...

Global site tag (gtag.js) - Google Analytics