原题
https://leetcode.cn/problems/permutations/description/
思路
回溯法 + 集合
复杂度
时间:O(C(n, n))
空间:O(C(n, n))
Python代码
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
ans = []
visited = set()
def backtrack(path):
if len(path) == len(nums):
ans.append(path[:])
return
for i in range(len(nums)):
if nums[i] not in visited:
visited.add(nums[i])
path.append(nums[i])
backtrack(path)
# 还原
path.pop()
visited.remove(nums[i])
backtrack([])
return ans
Go代码
func permute(nums []int) [][]int {
var ans [][]int
visited := map[int]bool{}
// 匿名函数
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[nums[i]] {
visited[nums[i]] = true
path = append(path, nums[i])
backtrack(path)
// 还原
path = path[:len(path)-1]
delete(visited, nums[i])
}
}
}
backtrack([]int{})
return ans
}
3920

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



