代码随想录 Day24 理论基础 77. 组合

理论基础 

1. 回溯是配合递归算法进行使用的,一般是在递归的下面。回溯的算法是一种暴力的算法,虽然效率并不高,但是常常使用。因为很多时候使用多层for(因为层数实在是套多了)也不能将题目解答,这个时候就需要使用到递归回溯算法。

2. 回溯算法可以解决的问题,回溯算法可以解决组合,排列,切割,子集,棋盘问题,在这些问题上使用回溯算法有着很好的效果。

组合:1234一个四个数,对于他们进行两两组合

排列:对于上述的组合建立一个顺序,进行排列

切割:将一个字符串进行切割成几种情况。

子集:1234一共四个数,去求它的子集。

棋盘问题:就是像是N皇后等。

3. 回溯算法一般都是可以抽象为一棵树

4. 回溯模型的模板:依然是三部曲

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

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

首先是函数和参数:一般是用backtracking(参数)

接下来就是终止情况:进行判断,如果是终止条件的话就存放结果并返回

最后是核心代码去:(这个地方还不是很理解,后面借助于例子再好好理解一下)

for循环就是遍历集合区间,可以理解一个节点有多少个孩子,这个for循环就执行多少次。

backtracking这里自己调用自己,实现递归。

大家可以从图中看出for循环可以理解是横向遍历,backtracking(递归)就是纵向遍历,这样就把这棵树全遍历完了,一般来说,搜索叶子节点就是找的其中一个结果了。

77. 组合

class Solution {
private:
    vector<vector<int>> result; // 存放符合条件结果的集合
    vector<int> path; // 用来存放符合条件结果
    void backtracking(int n, int k, int startIndex) {
        if (path.size() == k) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex; i <= n; i++) {
            path.push_back(i); // 处理节点
            backtracking(n, k, i + 1); // 递归
            path.pop_back(); // 回溯,撤销处理的节点
        }
    }
public:
    vector<vector<int>> combine(int n, int k) {
        result.clear(); // 可以不写
        path.clear();   // 可以不写
        backtracking(n, k, 1);
        return result;
    }
};

思路: 本题的思路还是比较难的,想要理解本题必须要画一棵树

1. 本题的终止条件也是比较难的,借助于树可以理解每次满了k个元素的时候,终止条件就是path每次满了k个元素的时候就是终止的时候。

2. 核心代码区域选择for循环,其中两个元素的第一个元素依次选择四个数中的一个,其实实际上也就是分别有四种情况。并且不断进行弹入,在满足第一个条件也就是达到k个元素的时候就进行终止返回上一层,在for循环中内容有回溯的部分就是pop_back()。

3. 对于组合问题,需要注意的是可以进行剪枝的操作,这样的话就可以使得树的一开始的位置就除去一些不必要处理的情况。

4. 对于递归和for循环的模拟过程是有难度的,好好理解模拟整个过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/503333.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HCIP【GRE VPN、MGRE VPN与PPP验证综合实验】

目录 实验要求&#xff1a; 实验拓扑图&#xff1a; 实验思路&#xff1a; 实验步骤&#xff1a; 一、配IP地址 &#xff08;1&#xff09;配置所有设备接口的IP地址&#xff1a; &#xff08;2&#xff09;配置私网与公网接口的缺省路由使得公网可通&#xff1a; 二、P…

学习日记(SSM整合流程_SpringMVC_part_two)

目录 大致流程如下 1、创建工程 2、SSM配置类结构 3、功能模块 代码部分 整体结构 Jdbc.Config MyBatisConfig ServletConfig SpringConfig SpringMvcConfig BookController BookDao Book BusinessException SystemException Cord Result BookService BookserviceImpl jd…

计算机网络 - 基础篇总结

TCP/IP 网络模型有哪几层&#xff1f; 1.应用层 为用户提供应用功能 2.传输层 负责为应用层提供网络支持 使用TCP和UDP 当传输层的数据包大小超过 MSS&#xff08;TCP 最大报文段长度&#xff09; &#xff0c;就要将数据包分块&#xff0c;这样即使中途有一个分块丢失或损坏…

Python耗时统计-可嵌套-生成Timeline-chrome://tracing/预览

Python耗时统计-可嵌套-生成Timeline-chrome://tracing/预览 一.效果二.代码 本文演示了如何用chrome://tracing查看python嵌套代码的耗时成分 一.效果 二.代码 import time import os import threading import queuedef singleeton(cls):单例instance{}def _singleton(*args,…

【opencv】教程代码 —features2D(3)Homography—分解单应性矩阵

decompose_homography.cpp 分解单应性矩阵 left01.jpg boardSize&#xff1a;9x6 squareSize:0.025 left02.jpg 相机内参 #include <iostream> // 引入输入输出流库 #include <opencv2/core.hpp> // 引入OpenCV的核心功能头文件 #include <opencv2/highgui.hp…

MATLAB 自定义中值滤波(54)

MATLAB 自定义中值滤波(54) 一、算法介绍二、算法实现1.原理2.代码一、算法介绍 中值滤波,是一种常见的点云平滑算法,改善原始点云的数据质量问题,MATLAB自带的工具似乎不太友好,这里提供自定义实现的点云中值滤波算法,具体效果如下所示: 中值滤波前: 中值滤波后:…

【Node.js】大文件上传

概述 大文件上传通常采用分片上传。如果因为某些原因上传突然中断&#xff0c;解决问题之后可以接着之前的分片上传&#xff0c;而不需要从头开始上传&#xff0c;也就是断点续传。此外还可以利用多个网络连接并行上传多个分片&#xff0c;提高上传速度。 注&#xff1a;前端不…

动手学机器学习逻辑斯谛回归+习题

逻辑斯谛函数下的线性模型 现需要用线性模型做分类问题&#xff0c;简单的阶跃函数在阈值处不可导&#xff0c;可导处导数均为0&#xff0c;性质不好 所以把0&#xff0c;1问题转化成P(y0|x)&#xff0c;P(y1|x)的问题&#xff0c;这样就把离散的分类任务变成了求概率分布的回…

ROS传感器图像转换

ros通过摄像头来获得图片&#xff0c;传感器数据类型为sensor_msgs中的Image&#xff0c;具体的数据类型组成&#xff1a; sensor_msgs/Image Documentationhttp://docs.ros.org/en/api/sensor_msgs/html/msg/Image.html但是我们一般使用opencv对图像进行处理&#xff0c;所以…

Python字符串字母大小写变换,高级Python开发技术

寻找有志同道合的小伙伴&#xff0c;互帮互助,群里还有不错的视频学习教程和PDF电子书&#xff01; ‘’’ demo ‘tHis iS a GOod boOK.’ print(demo.casefold()) print(demo.lower()) print(demo.upper()) print(demo.capitalize()) print(demo.title()) print(dem…

Python字典操作

假设我们有一个学生信息数据库&#xff0c;其中存储了每个学生的姓名、年龄、性别和成绩。我们可以使用字典来表示每个学生的信息&#xff0c;并将所有学生存储在一个字典列表中。 设计者&#xff1a;ISDF 版本&#xff1a;v1.0 日期&#xff1a;03/29/2024# 定义学生信息字典列…

如何划分训练集、测试集、验证集

训练集、测试集和验证集是在机器学习和数据科学中常用的术语&#xff0c;用于评估和验证模型的性能。它们通常用于监督学习任务中。 1. 训练集&#xff08;Training Set&#xff09;&#xff1a;训练集是用于训练机器学习模型的数据集。在训练期间&#xff0c;模型使用训练集中…

小狐狸ChatGPT付费AI创作系统V2.8.0独立版 + H5端 + 小程序前端

狐狸GPT付费体验系统的开发基于国外很火的ChatGPT&#xff0c;这是一种基于人工智能技术的问答系统&#xff0c;可以实现智能回答用户提出的问题。相比传统的问答系统&#xff0c;ChatGPT可以更加准确地理解用户的意图&#xff0c;提供更加精准的答案。同时&#xff0c;小狐狸G…

图形推理 总结

原则 1.图形相似且元素基本不变&#xff1a;此时多考虑图形的位置移动规律&#xff0c;如平移、旋转、翻转等。 2.图形相似但元素有同有异&#xff1a;这种情况下常考组合叠加-去异存同、去同存异等;元素遍历;部分传递等。 3.图形相异但较规则&#xff1a;常考对称、直曲性、…

JDK8的下载安装与环境变量配置教程

前言 官网下载&#xff1a;Java Archive Downloads - Java SE 8u211 and later 现在应该没人用32位的系统了吧&#xff0c;直接下载Windows x64 Installer jdk-8u391-windows-x64.exe 一、安装JDK 1. 打开jdk-8u391-windows-x64.exe 2. 直接下一步 3. 这个地方不要动他&…

神经网络与深度学习(一)

线性回归 定义 利用数理统计中回归分析&#xff0c;来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法 要素 训练集&#xff08;训练数据&#xff09;输出数据拟合函数数据条目数 场景 预测价格&#xff08;房屋、股票等&#xff09;、预测住院时间&#…

深入探讨Docker in Docker:原理与实战指南

在软件开发和部署中&#xff0c;容器化技术已经成为一个不可或缺的工具。而在使用Docker进行容器化时&#xff0c;有时可能会遇到需要在一个Docker容器中运行另一个Docker容器的情况&#xff0c;这就是所谓的"Docker in Docker"&#xff08;简称DinD&#xff09;。本…

java数组与集合框架(二)-- 集合框架,Iterator迭代器,list

集合框架&#xff1a; 用于存储数据的容器。 Java 集合框架概述 一方面&#xff0c;面向对象语言对事物的体现都是以对象的形式&#xff0c;为了方便对多个对象的操作&#xff0c;就要对对象进行存储。另一方面&#xff0c;使用Array存储对象方面具有一些弊端&#xff0c;而…

Redis从入门到精通(一)Redis安装与启动、Redis客户端的使用

文章目录 写在最前第1章 Redis概述1.1 初识Redis1.1.1 NoSQL1.1.2 Redis的特点与优势 1.2 安装Redis1.2.1 安装依赖库1.2.2 安装Redis1.2.3 启动Redis1.2.3.1 默认启动1.2.3.2 指定配置启动1.2.3.3 开机自启 1.3 Redis客户端1.3.1 命令行客户端1.3.2 图形化桌面客户端1.3.3 编程…

RVM安装Ruby笔记(Mac)

环境 硬件&#xff1a;Macbook Pro 系统&#xff1a;macOS 14.1 安装公钥 通过gpg安装公钥失败&#xff0c;报错如下&#xff1a; 换了几个公钥地址&#xff08;hkp://subkeys.pgp.net&#xff0c;hkp://keys.gnupg.net&#xff0c;hkp://pgp.mit.edu&#xff09;&#xff0c;…