首页 > 试题广场 >

第K个n的排列

[编程题]第K个n的排列
  • 热度指数:393 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个正整数 n 和一个正整数 k ,请你给出 [1,n] 的第 k 个排列。

例如 n = 3 时,他的排列按升序是
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

数据范围: ,
示例1

输入

5,3

输出

"12435"
示例2

输入

5,25

输出

"21345"
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @param k int整型
     * @return string字符串
     */

    List<List<Integer>> res = new ArrayList<>(); //存储全排列
    Deque<Integer> path = new LinkedList<>(); //存储一种排列
    public String KthPermutation (int n, int k) {
        // write code here
        backTrack(n,1); //start为1是题目设定
        List<Integer> cur = res.get(k-1);

        StringBuilder sb = new StringBuilder();
        cur.forEach(x->{
            sb.append(x);
        });
        return sb.toString();
    }
    private void backTrack(int n, int start) {
        //当path中的长度等于n,则证明此时已经找到一种排列了
        if (path.size() == n) {
            res.add(new ArrayList<>(path));
            return;
        }

        for (int i = start; i <= n; i++) {
            //存过的数跳过
            if(path.contains(i)){
                continue;
            }
            //添加新数
            path.add(i);
            //向下寻找
            backTrack(n,start);
            //回退
            path.removeLast();
        }
    }
}


发表于 2023-09-09 21:38:50 回复(0)
package main
//import "fmt"
import "strconv"
// import "sort"
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @param k int整型 
 * @return string字符串
*/
func KthPermutation( n int ,  k int ) string {
    ans:=""
    vis:=map[int]bool{}
    var dfs func(string)
    dfs=func(s string){
        if ans!=""{
            return
        }
        if len(s)==n{
            k--
            if k==0{
                ans=s
            }
            return
        }
        for i:=1;i<=n;i++{
            if vis[i]{
                continue
            }
            s+=strconv.Itoa(i)
            vis[i]=true
            dfs(s)
            s=s[:len(s)-1]
            vis[i]=false
        }
    }
    dfs("")
    return ans
}

发表于 2023-03-16 17:32:00 回复(0)
令一个1到n的数组,然后做全排列,最后的结果就是第k-1个全排列
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param n int整型 
# @param k int整型 
# @return string字符串
#
class Solution:
    def KthPermutation(self , n: int, k: int) -> str:
        # write code here
        nums=[]
        for i in range(n):
            nums.append(i+1)
        def qpl(first):
            if first == len(nums):
                ans.append(ans_inner[:])
                return
            for i in range(len(nums)):
                if vis[i] == 1:
                    continue
                vis[i]=1
                ans_inner.append(nums[i])
                qpl(first + 1)
                ans_inner.pop()
                vis[i]=0
        ans = []
        ans_inner=[]
        vis = [0] * len(nums)
        qpl(0)
        res=''
        for i in ans[k-1]:
            res+=str(i)
        return res


发表于 2022-12-20 23:33:42 回复(0)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @param k int整型 
     * @return string字符串
     */
    int num = 0;
    void recursion(vector<string>& S, const string& s, string& str, vector<int>& v){
        if(str.length() == s.length()){
            S.push_back(str);
            return;
        }
        for(int i=0; i<s.length(); i++){
            if(v[i]){
                continue;
            }
            str.push_back(s[i]);
            v[i] = 1;
            recursion(S, s, str, v);
            str.pop_back();
            v[i] = 0;
        }
    }
    string KthPermutation(int n, int k) {
        // write code here
        string s = "";
        for(int i=1; i<=n; i++){
            s += i + '0';
        }
        string str = "";
        vector<string> S;
        vector<int> v(s.length(), 0);
        recursion(S, s, str, v);
        //sort(S.begin(), S.end());
        return S[k-1];
    }
};


发表于 2022-12-06 14:52:01 回复(0)
# -*- coding: utf-8 -*-


#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param n int整型
# @param k int整型
# @return string字符串
#
class Solution:
    """
    题目:
        https://www.nowcoder.com/practice/1595969179464e4c940a90b36abb3c54?tpId=196&tqId=40457&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Fpage%3D8%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=undefined&tags=&title=
    算法:
        定义dfs[pos]表示当前将要在位置pos放置字符,定义visited[i]表示位置i的字符是否访问过。
        初始时刻,pos = 0
        边界条件:
            如果当前放置位置为n,说明字符串s的所有字符已经放置完毕,即找到1组解,加入结果集res
        剪枝:
            当res的长度为k时,说明已经找到答案,直接返回
    复杂度:
        时间复杂度:O(n * k)
        空间复杂度:O(n)
    """

    def KthPermutation(self, n, k):
        # write code here
        def dfs(idx):
            if idx == n:
                res.append("".join(combine[:]))
                return
            if len(res) == k: # 剪枝,我们只需要找到第k组排列就可以了
                return
            for i in range(1, n + 1):
                if i not in visited:
                    combine.append(str(i))
                    visited.add(i)
                    dfs(idx + 1)
                    combine.pop()
                    visited.remove(i)

        visited, combine, res = set(), [], []
        dfs(0)

        n = len(res)
        return res[k % n - 1]


if __name__ == "__main__":
    sol = Solution()

    # n, k = 5, 3

    n, k = 5, 25

    res = sol.KthPermutation(n, k)

    print res

发表于 2022-06-27 17:48:28 回复(0)