Merge pull request #572 from hitorig/master

Update 0046.全排列.md,更新了golang代码(原来的缺少permute函数)使用了切片思路 以及 第47题golang代码也有问题,同修改
This commit is contained in:
程序员Carl
2021-08-08 15:30:58 +08:00
committed by GitHub
2 changed files with 43 additions and 44 deletions

View File

@ -227,24 +227,27 @@ class Solution:
Go Go
```Go ```Go
var result [][]int var res [][]int
func backtrack(nums,pathNums []int,used []bool){ func permute(nums []int) [][]int {
if len(nums)==len(pathNums){ res = [][]int{}
tmp:=make([]int,len(nums)) backTrack(nums,len(nums),[]int{})
copy(tmp,pathNums) return res
result=append(result,tmp) }
//result=append(result,pathNums) func backTrack(nums []int,numsLen int,path []int) {
return if len(nums)==0{
} p:=make([]int,len(path))
for i:=0;i<len(nums);i++{ copy(p,path)
if !used[i]{ res = append(res,p)
used[i]=true }
pathNums=append(pathNums,nums[i]) for i:=0;i<numsLen;i++{
backtrack(nums,pathNums,used) cur:=nums[i]
pathNums=pathNums[:len(pathNums)-1] path = append(path,cur)
used[i]=false nums = append(nums[:i],nums[i+1:]...)//直接使用切片
} backTrack(nums,len(nums),path)
} nums = append(nums[:i],append([]int{cur},nums[i:]...)...)//回溯的时候切片也要复原,元素位置不能变
path = path[:len(path)-1]
}
} }
``` ```

View File

@ -228,35 +228,31 @@ Go
```go ```go
var res [][]int var res [][]int
func permute(nums []int) [][]int { func permute(nums []int) [][]int {
res = [][]int{} res = [][]int{}
sort.Ints(nums) backTrack(nums,len(nums),[]int{})
dfs(nums, make([]int, 0), make([]bool, len(nums))) return res
return res
} }
func backTrack(nums []int,numsLen int,path []int) {
if len(nums)==0{
p:=make([]int,len(path))
copy(p,path)
res = append(res,p)
}
used := [21]int{}//跟前一题唯一的区别同一层不使用重复的数。关于used的思想carl在递增子序列那一题中提到过
for i:=0;i<numsLen;i++{
if used[nums[i]+10]==1{
continue
}
cur:=nums[i]
path = append(path,cur)
used[nums[i]+10]=1
nums = append(nums[:i],nums[i+1:]...)
backTrack(nums,len(nums),path)
nums = append(nums[:i],append([]int{cur},nums[i:]...)...)
path = path[:len(path)-1]
func dfs(nums, path []int, used []bool) { }
if len(path) == len(nums) {
res = append(res, append([]int{}, path...))
return
}
m := make(map[int]bool)
for i := 0; i < len(nums); i++ {
// used 从剩余 nums 中选
if used[i] {
continue
}
// m 集合间去重
if _, ok := m[nums[i]]; ok {
continue
}
m[nums[i]] = true
path = append(path, nums[i])
used[i] = true
dfs(nums, path, used)
used[i] = false
path = path[:len(path)-1]
}
} }
``` ```