47 全排列2-中等

题目:

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

分析:

剪枝,回溯

// date 2023/11/07
func permuteUnique(nums []int) [][]int {
    res := make([][]int, 0, 1024)
    vis := make(map[int]bool)
    n := len(nums)

    temp := make([]int, 0, 16)

    var backtrack func(idx int)
    backtrack = func(idx int) {
        if idx == n {
            res = append(res, append([]int{}, temp...))
            return
        }
        for i, v := range nums {
            // vis[i] 已经填充过的,不再填充
            // i > 0 && nums[i-1] == && !vis[i-1]
            // 相同元素,及时没填充过,也不需要填充
            if i > 0 && nums[i-1] == v && !vis[i-1] || vis[i] {
                continue
            }
            temp = append(temp, v)
            vis[i] = true
            backtrack(idx+1)
            vis[i] = false
            temp = temp[:len(temp)-1]
        }
    }

    sort.Slice(nums, func(i,j int) bool {
        return nums[i] < nums[j]
    })

    backtrack(0)

    return res
}

最后更新于