mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 15:45:40 +08:00
@ -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]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user