LinkCode 第k个排列

# 递归的方法,创建一个visit判断此值是否已经添加过,每一层不断地循环,加入没有被访问的元素,直到最后结果的长度满足要求加入答案中
class Solution:
    """
    @param n: n
    @param k: the k-th permutation
    @return: a string, the k-th permutation
    """

    def getPermutation(self, n, k):
        nums = [x for x in range(1, n + 1)]
        visit = [0 for i in range(n)]
        self.ret = []
        self._permute(nums, visit, 0, [])
        # 因为结果要返回字符串类型,所以对数字类型进行处理
        ans = [str(j) for j in self.ret[k-1]]
        return "".join(ans)

    def _permute(self, nums, visit, count, ret):
        if count == len(nums):
            self.ret.append(ret)
            return
        for i in range(len(nums)):
            if visit[i] == 0:
                # ret += [nums[i]]  容易出错,如果加入这句后面需要还原,不然影响后面的循环
                visit[i] = 1
                self._permute(nums, visit, count + 1, ret + [nums[i]])
                visit[i] = 0
时间: 2024-11-05 06:10:56

LinkCode 第k个排列的相关文章

第k个排列

给定 n 和 k,求123..n组成的排列中的第 k 个排列. 注意事项 1 ≤ n ≤ 9 样例 对于 n = 3, 所有的排列如下: 123 132 213 231 312 321 如果 k = 4, 第4个排列为,231. 1 public class PaiLieK 2 { 3 public String getPermutation(int n, int k) 4 { 5 List<Integer> list = new ArrayList<>(); 6 List<

LeetCode 笔记21 生成第k个排列

题目是这样的: 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 (ie, for n = 3): "123" "132" "213" "231" "312"

leetcode排列,求第k个排列

stl 中的下一个排列在写一遍忘了 写个1个多小时,使用递归写的,错误就在我使用一个list保存当前剩下的数,然后利用k/(n-1)!的阶乘就是删除的数字,但进过观察, 比如 list={1,2,3} 分成3组: 1  {2,3} 2 {1,3} 3 {1,2} 确定位于哪个组,然后确定位于哪个组的第几个nyoj 511. 求第3个排列   ,3%2=1,删除 list就是第3个数3,其实呢是第2个树2 ,所以   计算方法为 (k-1)/(n-1)! 另外一个对于下一组,k%(n-1)!也不行

UVA - 12335 Lexicographic Order (第k大排列)

Description A Lexicographic Order Input: Standard Input Output: Standard Output The alphabet of a certain alien language consists of n distinct symbols. The symbols are like the letters of English alphabet but their ordering is different. You want to

ligh1060(求字符串第k大排列)组合数学

题意:求给定字符串(有重复字符)第k大排列. 解法:先判断字符串的所有排列是否够k个.然后从左向右每一位每一位确定.简单的组合数学. 代码: /**************************************************** * author:xiefubao *******************************************************/ #pragma comment(linker, "/STACK:102400000,10240000

[leetcode] 60. 第k个排列

60. 第k个排列 还是使用之前用过多次的nextPermutation方法...(几乎所有跟排列相关的题都是同一个题- -) class Solution { public String getPermutation(int n, int k) { int[] nums = new int[n]; for (int i = 1; i <= n; i++) { nums[i - 1] = i; } while (k > 1) { nextPermutation(nums); k--; } St

[Swift]LeetCode60. 第k个排列 | Permutation Sequence

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: "123" "132" "213" "231" "312" "321&

2015美团网 哈工大 第k个排列

leetcode 上的Permutation Sequence 下面是可执行代码 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 以1 开头 123,132,共2!个数 2 开头  213,231 3开头  312, 321 如果给你弟k个,能求出它位于以谁开头不?只要求出它位于第几个2!个,总体思路就是这个 2 3 import java.util.ArrayList; 4 5 public class Main { 6 //求N的阶乘 7 public static

第k个排列数

变长编码,这里排列的序号是0到n!-1,假设求 1,2,3,4 的第15个排列数,15/(3!) = 2, 余数是3,第一个数是(1,2,3,4)中的第二个数 3 (这里0是开始位置),3/(2!) = 1, 余数是1,第二个数就是(1,2,4)中的第一个数 2,  1/(1!) = 1, 余数是0,第三个数(1,4)中的第1个数就是4, 最后一个数就是1.结果就是3,2,4,1 #include <cstdio>#include <cstring>#include <vec