代码随想录day21|77组合|01笔记

173 阅读1分钟
  • 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]
            }
        }
    

image.png

  • 由于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]
            }
        }
    

image.png

  • 问题原因:没有归零全局变量
  • 解决方法
  • 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]
            }
        }