代码随想录第二十一天(一刷C语言)|回溯算法组合

news/2025/2/1 17:54:57/

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。

一、回溯算法

1、种类

排列、组合、分割、子集、棋盘问题

2、回溯步骤

(0)回溯抽象

        回溯法解决的问题均可以抽象为树形结构(N叉树)

(1)回溯函数模板返回值以及参数

        函数返回值一般为void,回溯算的参数一般是先写逻辑,然后需要什么参数,就填什么参数。

(2)回溯函数终止条件
if(条件成立) {存放结果;return;
}
(3)回溯搜索的遍历过程

       回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。

3、与递归对比和效率

回溯与递归方法和步骤类似,回溯是暴力查找,效率不高。

二、组合

思路:C解法参考了ledcode官方题解

lecode题目:https://leetcode.cn/problems/combinations/

AC代码:

int* temp;
int tempSize;int** ans;
int ansSize;void dfs(int cur, int n, int k) {// 剪枝:temp 长度加上区间 [cur, n] 的长度小于 k,不可能构造出长度为 k 的 tempif (tempSize + (n - cur + 1) < k) {return;}// 记录合法的答案if (tempSize == k) {int* tmp = malloc(sizeof(int) * k);for (int i = 0; i < k; i++) {tmp[i] = temp[i];}ans[ansSize++] = tmp;return;}// 考虑选择当前位置temp[tempSize++] = cur;dfs(cur + 1, n, k);tempSize--;// 考虑不选择当前位置dfs(cur + 1, n, k);
}int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {temp = malloc(sizeof(int) * k);ans = malloc(sizeof(int*) * 200001);tempSize = ansSize = 0;dfs(1, n, k);*returnSize = ansSize;*returnColumnSizes = malloc(sizeof(int) * ansSize);for (int i = 0; i < ansSize; i++) {(*returnColumnSizes)[i] = k;}return ans;
}

全篇后记:

        做起来有点蒙,不是很能理解其中的奥妙,希望通过后续的刷题能理清思路。


http://www.ppmy.cn/news/1258247.html

相关文章

【算法思考记录】力扣2952. 需要添加的硬币的最小数量【Python3,思路挖掘,贪心与证明】

原题链接 文章目录 需要添加的硬币的最小数量&#xff1a;贪心算法实现题目概述示例分析 关键思路分析贪心算法的优化选择证明案例推演与算法实现 Python 实现结论 需要添加的硬币的最小数量&#xff1a;贪心算法实现 题目概述 在这个困难难度的算法题中&#xff0c;我们要解…

【数据结构】链表OJ题(顺序表)(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

Linux环境执行命令python3 test.py传入字符串,test.py接收并处理字符串

可以使用Python脚本文件中的sys模块来接收并处理从Linux环境中传入的字符串命令。 下面是一个具体的示例&#xff1a; Linux环境中执行以下命令&#xff0c;传入字符串参数&#xff1a; python3 test.py "hello world"在test.py文件中&#xff0c;通过sys模块获取…

【Maven】依赖管理

1. 依赖管理 1.1 依赖配置 依赖&#xff1a;指当前项目运行所需要的jar包。一个项目中可以引入多个依赖。 依赖引入步骤&#xff1a;在pom.xml中编写标签&#xff0c;在标签中使用引入坐标&#xff0c;定义坐标的 groupId、artifactId、version&#xff0c;最后点击刷新&…

【前端开发】每一位高级Web工程师都应该掌握的10个Web API!

Photo by Hisu lee on Unsplash JavaScript中的某些API的使用率可能相对较低。下面我们将逐一介绍它们的使用和使用场景。 Blob API Blob API用于处理二进制数据&#xff0c;可以轻松地将数据转换为Blob对象或从Blob对象读取数据。 // Create a Blob object const myBlob …

虚拟局域网(VLAN)详解

文章目录 虚拟局域网(VLAN)详解1. VLAN简介2. VLAN工作原理3. VLAN类型4. VLAN优点5. 如何配置VLAN6. 常见问题与解决方案VLAN间通信问题 虚拟局域网(VLAN)详解 虚拟局域网 (VLAN) 是一种网络策略&#xff0c;用于在不受物理位置限制的情况下将设备划分到同一网络。这使得网络…

ifstream读取txt中的中文数据转成QString出现乱码

使用ifstream从txt文本中读取中文数据到string&#xff0c;再将string转成QString输出时出现了乱码。 分析&#xff1a;如果ifstream能成功从txt文本中读出中文数据&#xff0c;那大概率txt用的编码是ANSI编码&#xff08;GBK就是ANSI的一种&#xff09;&#xff0c;那么在转成…

c语言指针详解(上)

目录 一、指针的基本概念和用法 二、指针运算 2.1 指针的自增和自减运算 2.2 指针的自增和自减运算 三、数组和指针 四、指针和函数 4.1 在函数中使用指针作为参数和返回值 4.1.1 使用指针作为函数参数 4.1.2 使用指针作为函数返回值 4.2 指针参数的传值和传引用特性 4.2.1 指针…