【LeetCode】【60. Permutation Sequence】【python版】

本文介绍了一种算法,用于找出由1到n的整数构成的所有不同排列中的第k个排列。通过递归缩小范围的方法,文章详细解释了如何根据k值定位每个位置上的数字,最终形成所需的排列。

Description:
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.

Note:

  • Given n will be between 1 and 9 inclusive.
  • Given k will be between 1 and n! inclusive.

Example 1:

Input: n = 3, k = 3
Output: "213"

Example 2:

Input: n = 4, k = 9
Output: "2314"

思路:题目已经说明是n个不同的数字会有n!中排列方式,根据下图对“1234”的全排列,我们也能很明显看出这个结果是怎么得到的。按照第一个字符可以分为4组,每组再按照第二个字符可以分为3组,每组再按照第三个字符可以分为2组,所以有4×3×2种排列方式。


这里写图片描述

假如我们想得到第9个排列,转换为数组下标也就是8,定位顺序为level 1(1) → level 2 (1) → level 3 (0),下面来分析一下定位如何确定:

  • 最高位可以取{1,2,3,4},并且每个数在最高位出现3! = 6次,那么第9个排列的最高位取值的下标为:8/6 = 1,也就是数字2
  • 次位可以取{1,3,4},并且每个数在次位出现2I = 2 次,那么第9个排列的次位取值下标为:(8%6)/2 = 1,也就是数字3
  • 第三位可以取{1,4},并且每个数在第三位出现1次,那么第9个排列的第三位取值下标为:(8%6%2)/1 = 0,也就是数字1
  • 最后一位只有一个选择数字4
  • 最终得到第9个排列位2314

kiki表示在set中取值下标,n表示集合中数字个数,可以得到这样的推导式

k1=k/(n1)!k1=k/(n−1)!
k=k%(n1)!k=k%(n−1)!

k2=k/(n2)!k2=k/(n−2)!
k=k%(n2)!k=k%(n−2)!

kn1=k/1kn−1=k/1

class Solution(object):
    def getPermutation(self, n, k):
        """
        :type n: int
        :type k: int
        :rtype: str
        """
        import math
        numset = [i for i in range(1, n+1)]
        retnum = []
        k = k - 1
        while len(numset) > 1:
            n = n - 1
            index = k / math.factorial(n)
            retnum.append(str(numset[index]))
            k = k % math.factorial(n)
            numset.remove(numset[index])
        # 最后剩一个数字直接加在最后
        retnum.append(str(numset[0]))
        return ''.join(retnum)
LeetCode 是一个非常受欢迎的在线编程学习和算法练习平台,提供了大量的编程题目来帮助用户提高编码能力。对于 LeetCode 题目的完整 Python 解答,通常可以通过以下几种方式获取: 1. **官方题解**:每道 LeetCode 题目下方都有官方提供的题解,这些题解通常包括详细的思路分析、代码实现以及时间复杂度和空间复杂度的讨论。例如,经典的“两数之和”问题可以通过哈希表高效解决[^2]。 2. **社区分享**:许多开发者会在 GitHub、博客或其他技术社区分享他们的 LeetCode 解题经验。这些资源通常包含详细的注释和优化建议,适合不同水平的学习者参考。 3. **自动化工具与库**:一些开源项目如 `leetcode` 库可以帮助用户直接在本地环境中运行和测试 LeetCode 题目,甚至提供一键提交功能。 4. **在线 IDE**:LeetCode 自带的在线编辑器支持多种语言,包括 Python,并且可以直接运行测试用例并查看结果。 ### 示例:两数之和(Two Sum) 这是一个典型的 LeetCode 题目,要求找出数组中两个数的和等于目标值,并返回它们的下标。 ```python class Solution: def twoSum(self, nums, target): hash_map = {} for i, num in enumerate(nums): complement = target - num if complement in hash_map: return [hash_map[complement], i] hash_map[num] = i return [] ``` 此方法的时间复杂度为 O(n),因为每个元素只需要遍历一次;空间复杂度也为 O(n),用于存储哈希表中的元素。 ### 示例:统计 HTML 实体字符解析 下面是一个基于引用内容的 HTML 实体字符解析函数,它可以将字符串中的实体字符替换为对应的符号。 ```python class Solution: def entityParser(self, text: str) -> str: symbol_map = { '"': '"', '&apos;': "'", '&': '&', '>': '>', '<': '<', '⁄': '/' } i = 0 n = len(text) res = [] while i < n: flag = 0 if text[i] == '&': for s in symbol_map: if text[i:i + len(s)] == s: res.append(symbol_map[s]) i += len(s) flag = 1 break if flag == 0: res.append(text[i]) i += 1 return "".join(res) ``` 这段代码通过遍历字符串并检查是否存在匹配的 HTML 实体字符,从而实现了高效的解析。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值