GoLang刷题之leetcode

题目47:全排列Ⅱ

题目描述:

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

题解:

func permuteUnique(nums []int) [][]int {
    res, r:= [][]int{}, []int{}    
    used := make([]bool, len(nums))        
    if len(nums) == 1{
        res = append(res, nums)
    }else{
        sort.Ints(nums)
        backTracking(&res, r, 0, nums, used)
    }
    return res
}
func backTracking(res *[][]int, r []int, index int, nums []int, used []bool){
    if index == len(nums){
        tmp := make([]int, len(r))
        copy(tmp, r)
        *res = append(*res, tmp)
    }
    for i:=0;i<len(nums);i++{
        if used[i] || (i>0 && nums[i]==nums[i-1] && !used[i-1]){ //存在相同的数字但前一个数字并未使用过,应该先使用前一个数组
            continue
        }
        used[i] = true
        r = append(r, nums[i])
        backTracking(res, r, index+1, nums, used)
        used[i] = false
        r = r[:len(r)-1]
    }
}

你可能感兴趣的:(leetcode,算法,数据结构)