组合总数 II

组合总数 II

 

 https://leetcode.cn/problems/combination-sum-ii/

 

题解:https://leetcode.cn/problems/combination-sum-ii/solution/dai-ma-sui-xiang-lu-dai-ni-xue-tou-hui-s-ig29/

var ans [][]int    //最终结果
var mp map[int]bool //mp[i]标记同一层遍历过程中,candidate[i]这个数是否被重复使用
func combinationSum2(candidates []int, target int) [][]int {
    mp=make(map[int]bool)
    sort.Ints(candidates)
    var tmpAns []int    //中间结果
    ans=ans[:0] //每个测试样例需要初始化全局变量,否则会测试不通过
    dfs(0,0,target,candidates,tmpAns)
    return ans
}

func dfs(index,sum,target int,candidates,tmpAns []int){
    if sum==target{
        //tmp:=tmpAns[:len(tmpAns)]  //浅拷贝
        tmp:=make([]int,len(tmpAns))
        copy(tmp,tmpAns)//拷贝
        ans=append(ans,tmp)
        return
    }
    if sum>target{
        return
    }
    for i:=index;i<len(candidates);i++{
        if i>0&&candidates[i]==candidates[i-1]&&mp[i-1]==false{ //mp[i-1]==false,标识在同一层i遍历过程中,当前组合没有重复出现
            //假设candidate为[1,1],target=1,那么遍历第一个树的时候组合为[1]已经使用过,然后又取[1],那么就重复了
            continue
        }

        tmpAns=append(tmpAns,candidates[i])
        mp[i]=true
        sum=sum+candidates[i]
        dfs(i+1,sum,target,candidates,tmpAns)
        //回溯
        sum=sum-candidates[i]
        tmpAns=tmpAns[:len(tmpAns)-1]
        mp[i]=false
    }
}

 

posted @ 2022-06-27 16:27  知道了呀~  阅读(54)  评论(0编辑  收藏  举报