224 字
1 分钟
LeetCode-47. 全排列 II
回溯
给定一个可包含重复数字的序列
nums,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]示例 2:
输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
思路:相较于 46. 全排列 这里多了一步就是如何判断重复,通过if i > 0 && nums[i] == nums[i-1] && !used[i-1]这个语句,能避免重复的情况直接跳过
唯一需要注意的是i > 0 && nums[i] == nums[i-1]顺序不要写反了,不然会执行错误
func permuteUnique(nums []int) [][]int { sort.Ints(nums)
res := [][]int{} path := []int{} used := make([]bool, len(nums))
var backtrack func() backtrack = func() { if len(path) == len(nums) { res = append(res, append([]int(nil), path...)) }
for i := 0; i < len(nums); i++ { if used[i] { continue }
if i > 0 && nums[i] == nums[i-1] && !used[i-1] { continue }
path = append(path, nums[i]) used[i] = true backtrack() path = path[:len(path)-1] used[i] = false } }
backtrack() return res} LeetCode-47. 全排列 II
https://sheep44044.github.io/posts/算法/回溯/leetcode-47-全排列-ii/