【c++】【leetcode.77.797】组合问题/所有路径,回溯算法

在这里插入图片描述

解题思路

image.png
result[][]存放结果,path[]存放当前所选择的值,index代表当前所选的值。

回溯法代码总体框架:

void Backtricking(//参数)
    {
        if(//递归终止条件)
        {
            //保存结果
            return;
        }
        //递归
        //回溯
    }
  • 由递归树可知,终止条件是path.size()==k,
  • 把每一次要选的值先放入path中
  • 递归,选择下一个值到path中
  • 弹出最后放进的一个值,回到没选这个值的状态,去选择其他值。

剪枝策略
path.size()+剩下的所有值<k时可以知道这支没必要要了。
剩下的所有值为n-index+1

代码如下:

class Solution {
public:
    vector<int>path;//存放当前所选择的数
    vector<vector<int>>result;//存放最后的结果
    vector<vector<int>> combine(int n, int k) {
        Backtricking(n,k,1);
        return result;
    }
    void Backtricking(int n,int k,int index)
    {
        if(path.size()+n-index+1<k)return;//剪枝策略
        if(path.size()==k)//递归终止条件
        {
            result.push_back(path);//保存结果
            return;
        }
        for(int i=index;i<=n;i++)
        {
            path.push_back(i);//先把i放进path中
            Backtricking(n,k,i+1);//去选择i的下一个值放入path中
            path.pop_back();//回溯
        }
    }
};

所有路径
在这里插入图片描述
居然忘记了经典回溯算法的过程

代码

class Solution {
public:
    vector<vector<int>> ans;
    vector<int> tmp;
    int n;
    void dfs(vector<vector<int>>& graph,int x){   
        if(x == n - 1){
            ans.push_back(tmp);
            return;
        }
        for(auto i : graph[x]){
            tmp.push_back(i);
            dfs(graph,i);
            tmp.pop_back();
        }
        return;
    }
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        n = graph.size();
        tmp.push_back(0);
        dfs(graph,0);
        return ans;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值