package q46 func recurse(nums []int, offset int, buf []int, seen []bool, ret [][]int) [][]int { if offset == len(nums) { a := make([]int, len(buf)) copy(a, buf) return append(ret, a) } for i := range nums { if seen[i] { continue } seen[i] = true buf[offset] = nums[i] ret = recurse(nums, offset+1, buf, seen, ret) seen[i] = false } return ret } func permute(nums []int) [][]int { totalLen := 1 for i := range len(nums) { totalLen *= i + 1 } ret := make([][]int, 0, totalLen) buf := make([]int, len(nums)) seen := make([]bool, len(nums)) return recurse(nums, 0, buf, seen, ret) } var _ = permute