-
77组合
- 代码随想录 (programmercarl.com)
-
第一印象
- 回溯算法的经典题目
-
遇到问题
- 问题代码:
-
var ( result [][]int path []int ) func combine(n int, k int) [][]int { backtracking(n, k, 1) return result } func backtracking(n int, k int, index int) { if len(path)==k { result = append(result, path) return } for i:=index;i<=n - (k-len(path)) + 1;i++ { path = append(path, i) backtracking(n, k, i+1) path = path[:len(path)-1] } }
- 由于result压入的是全局path的指针,所以最后都变成了最后一个元素
- 解决方法:
- 每次压入path使用副本
-
if len(path)==k { tmp := make([]int, k) copy(tmp, path) result = append(result, tmp) return } - 问题代码2:
-
var ( result [][]int path []int ) func combine(n int, k int) [][]int { // backtracking(n, k, 1) return result } func backtracking(n int, k int, index int) { if len(path)==k { tmp := make([]int, k) copy(tmp, path) result = append(result, tmp) return } for i:=index;i<=n - (k-len(path)) + 1;i++ { path = append(path, i) backtracking(n, k, i+1) path = path[:len(path)-1] } }
- 问题原因:没有归零全局变量
- 解决方法
path, result = make([]int, 0, k), make([][]int, 0)-
解题代码
-
var ( result [][]int path []int ) func combine(n int, k int) [][]int { path, result = make([]int, 0, k), make([][]int, 0) backtracking(n, k, 1) return result } func backtracking(n int, k int, index int) { if len(path)==k { tmp := make([]int, k) copy(tmp, path) result = append(result, tmp) return } for i:=index;i<=n - (k-len(path)) + 1;i++ { path = append(path, i) backtracking(n, k, i+1) path = path[:len(path)-1] } }