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]]

提示: 1 <= nums.length <= 8 -10 <= nums[i] <= 10

解题思路:

func permuteUnique(nums []int) [][]int {

      var result [][]int
      
      var backtrack func(path []int, remaining []int)
      
      backtrack = func(path, remaining []int) {
	  	if len(path) == len(nums) {
	  		temp := make([]int, len(path))
	  		copy(temp, path)
	  		result = append(result, temp)
	  		return 
	  	}
      
	  	// 判断去重
	  	for i := 0; i < len(remaining); i++ {
	  		 // 去重
	  		if i > 0 && remaining[i-1] == remaining[i] {
	  			continue
	  		}
	  		path = append(path, remaining[i])	
	  		nextremaining := make([]int, len(remaining)-1)
	  		copy(nextremaining[:i], remaining[:i])
	  		copy(nextremaining[i:], remaining[i+1:])
	  		backtrack(path, nextremaining)
	  		path = path[:len(path)-1]
	  	}
	  }
	  // 排序
	  sort.Ints(nums)
	  backtrack(nil, nums)
	  return result
}