Leetcode专题[数组]-216-组合总和 III

力扣链接:
https://leetcode-cn.com/probl...
解题思路:

  1. 这道题目的解题思路是回溯算法,回溯算法是有固定的模版套路的,简单来说有以下三个条件:(1)选择列表,代表路径选择的时候从哪个列表中选择数据 (2)路径列表,表示哪些数字已经被选择进当前路径 (3)终止条件,表示什么时候结束循环,一般是k个数的时候或者和为target的时候
private void backtrack("原始参数") {
    //终止条件(递归必须要有终止条件)
    if ("终止条件") {
        //一些逻辑操作(可有可无,视情况而定)
        return;
    }

    for (int i = "for循环开始的参数"; i < "for循环结束的参数"; i++) {
        //一些逻辑操作(可有可无,视情况而定)

        //做出选择

        //递归
        backtrack("新的参数");
        //一些逻辑操作(可有可无,视情况而定)

        //撤销选择
    }
}

伪代码如上所示,在这道题中,有两个结束选择条件,一个是当路径中的数量等于规定的k个时,另一个是所有的数字和n<=0时;下标从1~9。可以写出代码如下:

func combinationSum3(k int, n int) [][]int {
    res := [][]int{}
    backtrack(&res, []int{}, k, n , 1)
    return res
}

func backtrack(res *[][]int, path []int, k, n, start int) {
    if len(path) == k || n <= 0 {
        if len(path) == k && n == 0 {
            newPath := make([]int, len(path))
            copy(newPath, path)
            *res = append(*res, newPath)
        }
        return
    }
    for i := start; i <= 9; i++ {
        path = append(path, i)
        backtrack(res, path, k, n - i, i + 1)
        path = path[:len(path) - 1]
    }
}

你可能感兴趣的:(golang)