47.全排列 II

55 阅读1分钟

题目:
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
算法:
和46题比较,backtracking函数已经和num[index]交换过位置的数字nums[i]就不再进行交换

func permuteUnique(nums []int) [][]int {
	ans := make([][]int, 0)
	var backtrack func(index int)
	backtrack = func(index int) {
		if index == len(nums) {
			ans = append(ans, append([]int{}, nums...))
			return
		}
		swaped := make(map[int]bool)
		for i := index; i < len(nums); i ++ {	
			if i == index || !swaped[nums[i]] {
				swaped[nums[i]] = true
				nums[index], nums[i] = nums[i], nums[index]
				backtrack(index + 1)
				nums[index], nums[i] = nums[i], nums[index]
			}
		}
	}
	// sort.Slice(nums, func(i, j int) bool {return nums[i] < nums[j]})
	backtrack(0)
	return ans
}