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<vector<int> > &combinations,int index,int target,vector<int> &combination,vector<int>& 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<vector<int>> combinationSum(vector<int>& candidates, int target)
    {
        vector<vector<int> > combinations;
        vector<int> combination;
        dfs(combinations,0,target,combination,candidates);
        return combinations;
    }
};

posted on 2021-12-17 20:12  coderabcd  阅读(30)  评论(0)    收藏  举报

导航