leetcode-回溯-39


题面

image-20201226094251967

官方题解

https://leetcode-cn.com/problems/combination-sum/solution/zu-he-zong-he-by-leetcode-solution/

重点

  • 回溯算法,采用递归实现,基本思路如下:

    https://assets.leetcode-cn.com/solution-static/39/39_fig1.png
  • 回溯的时候有个递归边界条件

    1. candidates遍历完成
    2. target==0
  • 每次面临两种选择,可以跳过当前数,也可以选择当前数(前提是target-当前数>0),但是“跳过”必须在“选择“之前

源代码(注释部分是重点内容)

class Solution
{
public:
    void dfs(vector > &combinations,int index,int target,vector &combination,vector& candidates)
    {
        //有两个递归边界条件,一个是candidates遍历完成,一个是target==0
        if(target==0)
        {
            combinations.push_back(combination);
            return;
        }
        //下面if条件语句不能写成(index == candidates.size()-1),这种情况下恰好说明到达了最后一个数字,不能直接返回
        if(index == candidates.size()){
            return;
        }
        int temp = candidates[index];

        //可以跳过当前数,也可以选择当前数(前提是target-temp>0)
        //“跳过”必须在“选择之前”,不能用if-else语句,否则就会出错
        dfs(combinations,index+1,target,combination,candidates);
        if(target-temp>=0)
        {
            combination.push_back(temp);
            dfs(combinations,index,target-temp,combination,candidates);
            combination.pop_back();
            //下面这一行语句不能写,否则就会重复枚举
            //dfs(combinations,index+1,target,combination,candidates);
        }
//        else
//        {
//            dfs(combinations,index+1,target,combination,candidates);
//        }
    }

    vector> combinationSum(vector& candidates, int target)
    {
        vector > combinations;
        vector combination;
        dfs(combinations,0,target,combination,candidates);
        return combinations;
    }
};