给定一个正整数 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
数据范围: ,
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(); } } }
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 }
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @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
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]; } };
# -*- 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