首页 > 编程语言 >代码随想录算法训练营第二十四天 | 回溯算法 77.组合

代码随想录算法训练营第二十四天 | 回溯算法 77.组合

时间:2024-06-04 12:44:37浏览次数:26  
标签:int ans 随想录 77 算法 vector 回溯 path backtracking

回溯算法理论基础

文章讲解 视频讲解

  • 回溯是递归的副产品,只要有回溯就会有递归
  • 回溯的本质是琼剧,所以效率不高

回溯法可以解决的问题

  • 组合问题
  • 切割问题
  • 子集问题
  • 排列问题
  • 棋盘问题

如何理解回溯

  • 回溯算法的问题都可以抽象为树形结构
  • 集合的大小就构成了书的快读,递归的深度就构成了树的深度

回溯法模板

回溯三部曲

  • 回溯函数返回值及参数
    返回值一般为void,参数通常不固定,先写逻辑需要什么参数再传什么参数

    void backtracking(参数)
    
  • 回溯函数终止条件
    一般来说搜索到叶子节点就可以回溯了

    if(终止条件) {
      存放结果;
      return;
    }
    
  • 回溯搜索的遍历过程

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

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

77.组合

题目链接 文章讲解 视频讲解

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        vector<int> path;
        vector<vector<int>> ans;
        backtracking(n, k, path, ans, 1);
        return ans;
    }

    void backtracking(int n, int k, vector<int>& path, vector<vector<int>>& ans, int startIndex) {
        // 终止条件
        if(path.size() == k) {
            ans.push_back(path);
            return ;
        }
        
        for(int i = startIndex; i <= n; ++i) {
            // 处理节点
            path.push_back(i);
            // 递归
            
            backtracking(n, k, path, ans, i + 1);
            
            // 回溯
            path.pop_back();

        }
    }
};

标签:int,ans,随想录,77,算法,vector,回溯,path,backtracking
From: https://www.cnblogs.com/cscpp/p/18230365

相关文章

  • 暗水印——变换域DCT水印算法(一种通用性强,能有抵御攻击的手段)
     随着计算机和网络技术的飞速发展,信息的安全保护问题日益突出。数字图像、音频和视频等多媒体数字产品愈来愈需要一种有效的版权保护方法——水印技术,通常用于保护知识产权、防止未经授权的访问、作弊等。广义上可以把水印技术划分为四大类:图像水印、视频水印、音频水印和......
  • 代码随想录算法训练营Day60 | 84.柱状图中最大的矩形 | Python | 个人记录向
    注:今天是代码随想录训练营的最后一天啦!!!本文目录84.柱状图中最大的矩形做题看文章以往忽略的知识点小结个人体会84.柱状图中最大的矩形代码随想录:84.柱状图中最大的矩形Leetcode:84.柱状图中最大的矩形做题无思路。看文章与42.接雨水很像,42.接雨水是找每个......
  • Carmack的快速开平方根倒数算法(Fast inverse square root)
    基本原理需求\(y=\frac{1}{\sqrt{x}}\)\(log(a^b×a^c)=bloga+cloga=(b+c)loga\)32位浮点表示法:二进制的科学计数法符号位1+阶码8(有符号的反码表示幂指数)+小数位23(二进制小数首位必为1,默认,只需表示小数位即可)-20240511163945890.webp)字符串形式:\(S_0​E_1​E_2​...E_7......
  • 代码随想录算法训练营第27天 | 39. 组合总和 、 40.组合总和II 、 131.分割回文串
    组合总和本题是集合里元素可以用无数次,那么和组合问题的差别其实仅在于startIndex上的控制题目链接/文章讲解:https://programmercarl.com/0039.组合总和.html视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ/***@param{number[]}candidates*@param{number......
  • 最小二乘法算法(个人总结版)
    最小二乘法(LeastSquaresMethod)是一种通过最小化误差平方和来拟合数据的回归分析方法。它被广泛应用于线性回归、多元回归以及其他数据拟合问题中。以下是详细的教程,涵盖基本概念、数学推导、具体步骤和实现代码。1.最小二乘法基本概念最小二乘法是一种用于数据拟合的统计......
  • 代码随想录算法训练营day13(栈与队列)
    代码随想录算法训练营day:学习内容:今天主要学习队列239347学习产出:239一开始想着直接暴力遍历,但是时间复杂度为nk。采用deque实现一个单调队列,因为我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最......
  • 代码随想录算法训练营第二十三天 | 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索
    669.修剪二叉搜索树题目链接文章讲解视频讲解classSolution{public:TreeNode*trimBST(TreeNode*root,intlow,inthigh){if(root==nullptr)returnnullptr;//当前值小于左边界时,当前节点的左子树全部小于左边界,所以全部删除,直接处理右子树......
  • leetcode 377. 组合总和 Ⅳ(dp)
    377.组合总和Ⅳ-力扣(LeetCode)dp,跟完全背包反着来,可以当作是爬楼梯来做,相当于每次爬的楼梯数是从数组种选的。1#defineIOstd::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)2#definebug(x)cout<<#x<<"is"<<x<<endl;3#include<bits/stdc++.h>4usin......
  • 混合高斯背景减除算法实现背景建模
     本代码将实现视频中的背景和前景分离,并定位行人。1.实现效果以下为处理后的视频截图2.定义卷积核importcv2cap=cv2.VideoCapture('test.avi')kernel=cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))#kernel:[[010],[111],[010]]#定义一个3*3的......
  • 算法第四天力扣第704题:二分查找
    704.二分查找的题目链接如下:https://leetcode.cn/problems/binary-search/https://leetcode.cn/problems/binary-search/  给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 ......