Permutations II

全排列 II

题目描述

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

示例:

输入:nums = [1, 1, 2]
输出:
[
    [1,1,2],
    [1,2,1],
    [2,1,1]
]

解法

解法一:回溯法(1)

func permuteUnique(nums []int) [][]int {
    sort.Ints(nums)
    res := [][]int{}
    history := make([]bool, len(nums))
    maybe := []int{}
    return tracebackUnique(nums, maybe, res, history)
}

func tracebackUnique(nums []int, maybe []int, res [][]int, history []bool) [][]int {
    if len(maybe) == len(nums) {
        res = append(res, append([]int{}, maybe...))
        return res
    }

    for i, v := range nums {
        if history[i] || i > 0 && !history[i-1] && v == nums[i-1] {
            continue
        }

        history[i] = true
        maybe = append(maybe, v)
        res = tracebackUnique(nums, maybe, res, history)

        history[i] = false
        maybe = maybe[:len(maybe)-1]
    }
    return res
}

解法二:回溯法(2)

func permuteUnique(nums []int) [][]int {
    sort.Ints(nums)
    res := [][]int{}
    return tracebackUnique(nums, res, 0)
}

func tracebackUnique(nums []int, res [][]int, start int) [][]int {
    if start == len(nums) {
        res = append(res, nums)
        return res
    }

    for i := start; i < len(nums); i++ {
        if i != start && nums[i] == nums[start] {
            continue
        }
        nums[start], nums[i] = nums[i], nums[start]

        tmp := append([]int{}, nums...)
        res = tracebackUnique(tmp, res, start+1)
    }
    return res
}

Last updated

Was this helpful?