46. 全排列
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1]
输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
中的所有整数 互不相同
递归 + 回溯
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| func permute(nums []int) [][]int { var res [][]int visited := map[int]bool{} var dfs func(p []int) dfs = func(p []int) { if len(p) == len(nums) { ans := make([]int, len(p)) copy(ans, p) res = append(res, ans) } for _, n := range nums { if visited[n] { continue } p = append(p, n) visited[n] = true dfs(p) p = p[:len(p)-1] visited[n] = false } } dfs([]int{}) return res }
|
元素替换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| func permute(nums []int) [][]int { n := len(nums) var ans [][]int var dfs func(int) dfs = func(i int) { if i == n-1 { ans = append(ans, append([]int{}, nums...)) return } for j:=i; j<n; j++ { swap(nums, i, j) dfs(i+1) swap(nums, i, j) } } dfs(0) return ans } func swap(nums []int, i, j int) { nums[i], nums[j] = nums[j], nums[i] }
|