leetcode39.组合总和

Problem: 39. 组合总和

思路

参考组合,组合是通过start=i+1避免选择重复元素,但本题是可以选择重复元素,所以start=i。没有规定是必须几个元素,核心思想和零钱兑换一样,但是硬币可以重复选。

Code

var mem []int
var res [][]int
func combinationSum(candidates []int, target int) [][]int {
    //核心思想,参考子集/组合/路径总和II/零钱兑换,我对这道题的理解是组合+零钱兑换
    mem=make([]int,0)
    res=make([][]int,0)

    dfs(0,target,candidates)
    return res
    
}

// start不要的话,会出现[2,2,3] [3,2,2] [2,3,2],用start来控制元素不会往前选,往前选肯定会出现此种重服组合
func dfs(start,amount int ,coins []int) {
    if amount==0{
        temp:=make([]int,len(mem))
        copy(temp,mem)
        res=append(res,temp)
        return 
    }
    if amount<0{
        return
    }
    

    for i:=start;i<len(coins);i++{
        mem=append(mem,coins[i])
        // start不用传i+1来避免重复,可以重复选择当前元素
        dfs(i,amount-coins[i],coins)
        mem=mem[:len(mem)-1]
    }
    return
}

Last updated