有重复项数字的全排列

last modify

有重复项数字的全排列_牛客题霸_牛客网

问题简述

给出一组可能包含重复项的数字,返回该组数字的所有排列。结果以字典序升序排列。

思路:DFS+回溯

Python
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
# 
# @param num int整型一维数组 
# @return int整型二维数组
#
class Solution:
    def permuteUnique(self , num: List[int]) -> List[List[int]]:
        
        ret = []
        tmp = []
        N = len(num)
        
        num.sort()  # 排序
        book = [0] * N
        
        def dfs(deep):
            if deep == N:
                ret.append(tmp[:])
                return 
            
            for i in range(N):
                if book[i]:
                    continue
                
                # 树层剪枝
                if not book[i - 1] and i > 0 and num[i] == num[i - 1]:
                    continue
                # 为什么是 not book[i - 1]?
                #   当遍历完一条路径回到本层的时候,book[i - 1] 会回溯为 0,
                #   此时如果还有 num[i] == num[i - 1],说明当前路径重复,直接跳过
                
                book[i] = 1
                tmp.append(num[i])
                dfs(deep + 1)
                tmp.pop()
                book[i] = 0
        
        dfs(0)
        return ret

Last updated