返回

LeetCode 47 Permutations II:Permutation with Duplicates

前端

LeetCode 47排列 II

题目概述

LeetCode 47: Permutations II 是一个数组类型的题目,属于中等难度。题目要求你给定一个包含重复数字的数组,找出所有可能的排列。

解题思路

这道题可以使用回溯法来解决。回溯法是一种从问题空间的根节点出发,沿着各个分支依次探索并记录节点,在遇到不能继续探索的分支后,回退到上一个已访问的分支,然后再继续探索下一个分支的方法。

具体步骤

  1. 将数组排序。
  2. 初始化一个结果列表 result 和一个访问过的元素列表 visited
  3. 从第一个元素开始,循环遍历数组中的每个元素。
  4. 如果当前元素在 visited 列表中,则跳过。
  5. 如果当前元素不在 visited 列表中,则将当前元素添加到 visited 列表中,并将当前元素添加到 result 列表中。
  6. 递归调用该函数,将当前元素之后的元素作为参数。
  7. 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)。