原题
https://leetcode.cn/problems/permutations-ii/description/
思路
回溯法 + 去重
复杂度
时间:O(C(n, n))
空间:O(C(n, n))
Python代码
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
def backtrack(path):
if len(path) == len(nums):
ans.append(path.copy())
return
for i in range(len(nums)):
# 去重
if visited[i] or (
i > 0 and nums[i] == nums[i - 1] and not visited[i - 1]
):
continue
visited[i] = True
path.append(nums[i])
# 回溯
backtrack(path)
# 还原
path.pop()
visited[i] = False
ans = []
# 排序
nums.sort()
visited = [False] * len(nums)
backtrack([])
return ans
Go代码
func permuteUnique(nums []int) [][]int {
var ans [][]int
// 排序
sort.Ints(nums)
visited := make([]bool, len(nums))
// 匿名函数
var backtrack func([]int)
backtrack = func(path []int) {
if len(path) == len(nums) {
// 复制路径
com := make([]int, len(path))
copy(com, path)
ans = append(ans, com)
return
}
for i := 0; i < len(nums); i++ {
// 去重
if visited[i] || (i > 0 && nums[i] == nums[i-1] && !visited[i-1]) {
continue
}
visited[i] = true
path = append(path, nums[i])
// 回溯
backtrack(path)
// 还原
path = path[:len(path)-1]
visited[i] = false
}
}
backtrack([]int{})
return ans
}
全排列 II 的实现与分析
416

被折叠的 条评论
为什么被折叠?



