leetcode-47.全排列II
如何在有重复值的时候节省时间是优化重点。
基础写法肯定是按无重复值时的全排列写,在其中要加上防止走重复路径的分支。
能防止的也只有同层,如果同层走一个值,但是该值重复,且走过了,则放弃走该分支。所以设layer_used_num这个set。
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
results = []
def backtrack(path, path_used_idx):
if len(path) == len(nums):
results.append(path[:])
return
layer_used_num = set()
for i in range(0, len(nums)):
if nums[i] in layer_used_num:
continue
if i in path_used_idx:
continue
layer_used_num.add(nums[i])
path.append(nums[i])
path_used_idx.add(i)
backtrack(path, path_used_idx)
path.pop()
path_used_idx.remove(i)
backtrack([], set())
return results