有重复项数字的全排列
Last updated
Last updated
问题简述
给出一组可能包含重复项的数字,返回该组数字的所有排列。结果以字典序升序排列。
思路:DFS+回溯
难点是重复数字的剪枝;
定义 book[i] = 1
表示 num[i]
已经使用过;
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# @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