【专题:回溯】排列系列

197 阅读1分钟

46.全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例1

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

示例2

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

示例3

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

解法

func permute(nums []int) [][]int {
    res:=[][]int{}
    used:=make([]bool,len(nums))
    dfs(nums,0,nil,used,&res)
    return res
}

func dfs(nums []int, index int, temp []int, used []bool, res *[][]int){
    if len(temp)==len(nums){
        copyTemp:=make([]int,len(nums))
        copy(copyTemp,temp)
        *res=append(*res,copyTemp)
        return 
    }
    for i:=0;i<len(nums);i++{
       
        if used[i]!=true{
            used[i]=true
            dfs(nums,i+1,append(temp,nums[i]),used,res)
            used[i]=false
        }
    }
    return
}

解题

46.jpg

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

解法

func permuteUnique(nums []int) [][]int {
    sort.Ints(nums)
    res:=[][]int{}
    used:=make([]bool,len(nums))
    dfs(nums,0,nil,used,&res)
    return res
}

func dfs(nums []int,index int, temp []int, used []bool, res *[][]int){
    if len(temp)==len(nums){
        copyTmep:=make([]int,len(temp))
        copy(copyTmep,temp)
        *res=append(*res,copyTmep)
        return 
    }
    for i:=0;i<len(nums);i++{
        if i > 0 && nums[i] == nums[i - 1] && used[i - 1] { 
            continue
        }
        if !used[i]{
            used[i]=true
            dfs(nums,i+1,append(temp,nums[i]),used,res)
            used[i]=false
        }
    }
}

解题

47.jpg