返回
LeetCode 47 Permutations II:Permutation with Duplicates
前端
2023-11-07 21:40:54
LeetCode 47排列 II
题目概述
LeetCode 47: Permutations II 是一个数组类型的题目,属于中等难度。题目要求你给定一个包含重复数字的数组,找出所有可能的排列。
解题思路
这道题可以使用回溯法来解决。回溯法是一种从问题空间的根节点出发,沿着各个分支依次探索并记录节点,在遇到不能继续探索的分支后,回退到上一个已访问的分支,然后再继续探索下一个分支的方法。
具体步骤
- 将数组排序。
- 初始化一个结果列表
result
和一个访问过的元素列表visited
。 - 从第一个元素开始,循环遍历数组中的每个元素。
- 如果当前元素在
visited
列表中,则跳过。 - 如果当前元素不在
visited
列表中,则将当前元素添加到visited
列表中,并将当前元素添加到result
列表中。 - 递归调用该函数,将当前元素之后的元素作为参数。
- 从
visited
列表中移除当前元素。
实现代码
def permuteUnique(nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
nums.sort()
result = []
visited = []
def backtrack(start):
if start == len(nums):
result.append(visited.copy())
return
for i in range(start, len(nums)):
if i > start and nums[i] == nums[i - 1]:
continue
visited.append(nums[i])
backtrack(i + 1)
visited.pop()
backtrack(0)
return result
时间复杂度
该算法的时间复杂度为 O(n!),其中 n 是数组的长度。这是因为对于每个元素,我们需要检查是否已经访问过它,这需要 O(n) 的时间。然后,我们需要将该元素添加到结果列表中,这需要 O(1) 的时间。最后,我们需要递归调用该函数,这需要 O(n) 的时间。因此,总的时间复杂度为 O(n!)。
空间复杂度
该算法的空间复杂度为 O(n),其中 n 是数组的长度。这是因为我们需要一个列表来存储访问过的元素,该列表的大小不会超过 n。此外,我们还需要一个递归栈,其大小也为 O(n)。因此,总的空间复杂度为 O(n)。