回溯leetcode216组合总数3:

> Problem: [216. 组合总和 III](https://leetcode.cn/problems/combination-sum-iii/description/)

# 思路

> 首先看到这个组合想到组合总和1,借用组合总和1的思路,只需要标记使用过的数字然后逐次遍历就好

# 解题方法

>首先是backtracking的递归出口,刚开始的时候设置的递归出口是target==0,但是后来debug发现在[1,6]的时候会出来[1,6,0]是因为paths在[1,6]的时候刚好等于target于是递归到出口处,复制给temp的之后数组直接把0复制上了,于是再加上另一个递归条件len(path)==k;后续横向处理for循环逻辑的时候只需要一个map标记上已经使用过的数字就好了。




func combinationSum3(k int, n int) (res [][]int) {

    startIndex := 1

    backtracking(k, n, startIndex, []int{}, &res)

    return

}


func backtracking(k int, target, startIndex int, paths []int, res *[][]int) {

    if target == 0 && len(paths) == k {

        temp := make([]int, k)

        copy(temp, paths)

        *res = append(*res, temp)

        return

    }

    user := make(map[int]bool)

    for i := startIndex; i <= 9; i++ {

        if i <= target && !user[i] {

            paths = append(paths, i)

            user[i] = true

            backtracking(k, target-i, i+1, paths, res)

            paths = paths[:len(paths)-1]

            user[i] = false

        }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值