算法刷题Day 24 回溯算法理论基础+组合

这篇具有很好参考价值的文章主要介绍了算法刷题Day 24 回溯算法理论基础+组合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Day 24 回溯算法

理论基础

回溯法,一般可以解决如下几种问题:

  • 组合问题:N个数里面按一定规则找出k个数的集合
  • 切割问题:一个字符串按一定规则有几种切割方式
  • 子集问题:一个N个数的集合里有多少符合条件的子集
  • 排列问题:N个数按一定规则全排列,有几种排列方式
  • 棋盘问题:N皇后,解数独等等

回溯算法模板框架如下:

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

组合

class Solution {
    vector<vector<int>> table;
    vector<int> path;

    void backtracking(int start, int end, int k)
    {
        if (path.size() == k)
        {
            table.push_back(path);
            return;
        }

        for (int i = start; i <= end; ++i)
        {
            path.push_back(i);
            backtracking(i + 1, end, k);
            path.pop_back();
        }
    }

public:
    vector<vector<int>> combine(int n, int k) {
        table.clear();
        path.clear();

        backtracking(1, n, k);
        return table;
    }
};

剪枝

回溯的剪枝是面试有可能被问到的点文章来源地址https://www.toymoban.com/news/detail-613979.html

class Solution {
    vector<vector<int>> table;
    vector<int> path;

    void backtracking(int start, int end, int k)
    {
        if (path.size() == k)
        {
            table.push_back(path);
            return;
        }

        for (int i = start; i <= end - (k - path.size()) + 1; ++i)
        {
            path.push_back(i);
            backtracking(i + 1, end, k);
            path.pop_back();
        }
    }

public:
    vector<vector<int>> combine(int n, int k) {
        table.clear();
        path.clear();

        backtracking(1, n, k);
        return table;
    }
};

到了这里,关于算法刷题Day 24 回溯算法理论基础+组合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录Day20 回溯算法 LeetCode77 组合问题

    以下内容更详细解释来自于:代码随想录 (programmercarl.com) 回溯法也叫回溯搜索法,是搜索法的一种,我们之前在二叉树中也经常使用到回溯来解决问题,其实 有递归就有回溯 ,有的时候回溯隐藏在递归之下,我们不容易发觉,今天我们来详细介绍一下什么是回溯,它能解决哪些问题.

    2024年02月08日
    浏览(54)
  • 【Leetcode60天带刷】day27回溯算法——39. 组合总和,40.组合总和II,131.分割回文串

    ​ 39. 组合总和 给你一个  无重复元素  的整数数组  candidates  和一个目标整数  target  ,找出  candidates  中可以使数字和为目标数  target  的 所有   不同组合  ,并以列表形式返回。你可以按  任意顺序  返回这些组合。 candidates  中的  同一个  数字可以  无限制重复

    2024年02月11日
    浏览(46)
  • 算法刷题Day 27 组合总和+组合总和II+分割回文子串

    本题的特点是元素为可重复选取的 其实只要在原来的基础上添加一点小小的变化就是实现重复选取(与排列区别开),一时没想出来 这里与39.组合总和 (opens new window)最大的不同就是要去重了。 前面我们提到:要去重的是“同一树层上的使用过”,如何判断同一树层上元素(

    2024年02月14日
    浏览(41)
  • 每日刷题|回溯法解决组合问题

                                            食用指南:本文为作者刷题中认为有必要记录的题目                                        ♈️ 今日夜电波: 保留—郭顶                                                                 1:33 ━━━━━━️💟──

    2024年02月07日
    浏览(37)
  • 力扣算法刷题Day44|动态规划:完全背包问题 零钱兑换II 组合总和Ⅳ

    力扣题目:#518.零钱兑换II(完全背包组合问题) 刷题时长:7min 解题方法:动态规划(完全背包) 复杂度分析 时间复杂度: O(mn),其中 m 是amount,n 是 coins 的长度 空间复杂度: O(m) 问题总结 对递推公式的理解 本题收获 题意转换:纯完全背包是凑成背包最大价值是多少,而本

    2024年02月13日
    浏览(42)
  • LeetCode刷题13:回溯+剪枝解决216.组合总和 III

    找出所有相加之和为  n   的  k   个数的组合,且满足下列条件: 只使用数字1到9 每个数字  最多使用一次   返回  所有可能的有效组合的列表  。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]] 解释: 1 + 2 + 4 = 7 没有其他

    2024年02月02日
    浏览(44)
  • Day 25 | 回溯 216.组合总和III 、17.电话号码的字母组合

    题目 文章讲解 视频讲解 思路: 以回溯函数做对称,上面做了什么操作,下面也是 题目 文章讲解 视频讲解 思路:思路上和组合很像,不同的是对字符串进行操作 还得再想想

    2024年01月21日
    浏览(44)
  • 【回溯算法】77. 组合

    回溯结束条件 track长度等于k 然后收集当前的路径 遍历所有的节点 然后选择当前节点 通过start参数控制遍历 避免产生重复的子集 移除当前的选择

    2024年02月09日
    浏览(38)
  • 算法套路十一 ——回溯法之组合型回溯

    该节是在上一节回溯法之子集型回溯的基础上进行描写,组合型回溯会在子集型回溯的基础上判断所选子集是否符合组合要求, 故请首先阅读上一节算法套路十——回溯法之子集型回溯 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返

    2023年04月22日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包