Merge pull request #488 from X-shuffle/master

增加 0047.全排列II go版本
This commit is contained in:
程序员Carl
2021-07-14 15:36:42 +08:00
committed by GitHub

View File

@ -296,7 +296,45 @@ var permuteUnique = function (nums) {
};
```
Go
回溯+本层去重+下层去重
```golang
func permuteUnique(nums []int) [][]int {
var subRes []int
var res [][]int
sort.Ints(nums)
used:=make([]bool,len(nums))
backTring(nums,subRes,&res,used)
return res
}
func backTring(nums,subRes []int,res *[][]int,used []bool){
if len(subRes)==len(nums){
tmp:=make([]int,len(nums))
copy(tmp,subRes)
*res=append(*res,tmp)
return
}
// used[i - 1] == true说明同一树支candidates[i - 1]使用过
// used[i - 1] == false说明同一树层candidates[i - 1]使用过
for i:=0;i<len(nums);i++{
if i>0&&nums[i]==nums[i-1]&&used[i-1]==false{//当本层元素相同且前一个被使用过,则继续向后找(本层去重)
continue
}
//到达这里有两种情况1.该层前后元素不同2.该层前后元素相同但该层没有使用过
//所以只能对该层没有被使用过的抽取
if used[i]==false{
//首先将该元素置为使用过(即同一树枝使用过),下一层的元素就不能选择重复使用过的元素(下层去重)
used[i]=true
subRes=append(subRes,nums[i])
backTring(nums,subRes,res,used)
//回溯
//回溯回来将该元素置为false表示该元素在该层使用过
used[i]=false
subRes=subRes[:len(subRes)-1]
}
}
}
```