基础算法
文章平均质量分 89
阳光开朗大男孩(๑•̀ㅂ•́)و✧
C++博主太难混了,转行做AI博主. Hi~ o(* ̄▽ ̄*)ブ
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
手撕算法——宽度优先搜索-BFS
该博客聚焦广度优先搜索(BFS)算法,从单源BFS出发,以马的遍历等问题为例,结合剪枝优化求最短路径;多源BFS以矩阵距离等题,把多源点入队后按常规逻辑求解;01 BFS根据权值0或1确定节点入队位置;Floodfill问题通过遍历标记,解决湖计数、颜色填涂等区域处理问题,展现BFS在不同场景的灵活应用。原创 2025-04-06 00:13:22 · 1003 阅读 · 0 评论 -
手撕算法——深度优先搜索—DFS
文本围绕递归型枚举、回溯剪枝及DFS展开讲解。先介绍回溯与剪枝概念,给出枚举子集等递归型枚举的题目、原理与代码;再借选数等问题说明DFS标记及剪枝方法;接着阐述剪枝与优化策略,以数的划分等为例展示搜索、剪枝及枚举优化;最后讲解记忆化搜索,借斐波那契数等说明其原理与代码,助力理解复杂搜索算法与优化技巧 。原创 2025-04-01 01:34:46 · 858 阅读 · 0 评论 -
算法基础——二叉树
该博客围绕二叉树展开介绍。概念上,二叉树结点分左右孩子且顺序固定,特殊二叉树有满二叉树和完全二叉树。存储方式包括顺序存储和链式存储。以一个有n个结点的二叉树为案例,通过输入每个结点左右子结点编号建立二叉树。遍历方面,深度优先遍历有先序、中序、后序三种,分别给出代码实现及多组测试数据;宽度优先遍历则借助队列进行层序遍历,也给出了相应代码实现。原创 2025-03-29 23:32:47 · 568 阅读 · 0 评论 -
算法基础——树
该博客主要介绍树的相关知识。树是重要的非线性数据结构,涉及树的定义、基本术语、有序与无序树、有根与无根树等概念。存储方式有孩子表示法,包括用vector数组和链式前向星实现,vector数组虽耗时但一般不影响算法竞赛。遍历方法有深度优先遍历(DFS)和宽度优先遍历(BFS),并分别给出用vector数组和链式前向星存储时的实现代码,还展示了DFS和BFS处理特定输入数据的过程,此外还给出了斐波那契数列的递归实现代码。原创 2025-03-29 22:34:29 · 610 阅读 · 0 评论 -
算法基础——栈
这篇博客介绍了栈的概念与模拟实现及C++中stack相关内容。栈是只在一端进行数据插入和删除的线性表,插入删除端为栈顶,另一端为栈底。栈的模拟实现可通过创建数组和变量记录元素个数来完成,包含进栈、出栈、获取栈顶元素、判空、求元素个数等操作。在C++中,stack的创建为stack<T> st形式,T可为任意类型,还可使用size、empty、push、pop、top等操作,文末给出了相应测试代码。原创 2025-03-24 00:04:20 · 606 阅读 · 0 评论 -
手撕算法——链表
该博客介绍了四个与链表应用相关的问题。一是排队顺序问题,用静态链表存储,依题意修改指针域,根据给定头结点遍历输出。二是单向链表问题,属链表模板题,实现单链表,包括插入、查询、删除等操作。三是队列安排问题,因频繁在某位置前后插入元素,采用双向循环链表模拟,含初始化、插入及删除操作。四是约瑟夫问题,用循环链表模拟,不过代码未给出完整内容。原创 2025-03-23 15:15:22 · 349 阅读 · 0 评论 -
算法基础——链表
该博客介绍链表相关知识。链表是线性表的链式存储,元素存于任意存储单元,结点含数据域和指针域,有8种结构。单链表模拟实现分动态(用new和delete)和静态(用数组),包括定义、头插、遍历、按值查找(可哈希优化)、插入、删除等操作,尾插等操作因复杂度高没必要实现。双向链表在单链表基础上加前驱指针数组,有类似操作。循环链表中带头单向链表结构可成环。还介绍了动态链表list,包括创建、头插尾插、头删尾删等操作及其时间复杂度,并给出测试代码 。原创 2025-03-23 13:43:46 · 1081 阅读 · 0 评论 -
手撕算法——二分
二分算法用于当解具有二段性时,通过分析待查找区间中点位置,舍弃一半区间,在有答案区间继续查找。其模板有找区间左、右端点两种,求中点时为防溢出可采用 `mid = l + (r - l) / 2` 。时间复杂度为logN ,记住 `if/else` 中出现 `-1` 时求 `mid` 就 `+1` 。解决流程是先画图确定模板,得出结果后判断是否存在。STL 中 `lower_bound` 、`upper_bound` 可辅助查找但有局限。还介绍了二分答案在木材加工、砍树、跳石头等问题中的应用及原理。原创 2025-03-22 18:44:00 · 1090 阅读 · 0 评论 -
手撕算法——差分
博客主要介绍了差分算法相关内容,包括一维差分、海底高铁(涉及一维差分应用)、二维差分及地毯(二维差分应用)。一维差分可用于处理区间修改问题,通过创建差分数组,利用其性质处理区间修改,最后通过前缀和还原原始数组。海底高铁问题则是利用差分数组计算高铁乘坐次数,进而求出最小花费。二维差分是一维差分的扩展,通过类比推导出二维差分矩阵的性质,可用于处理二维矩阵的区间修改问题,同样通过前缀和还原原始矩阵。地毯问题直接利用二维差分矩阵解决。这些内容通过具体的题目描述、算法原理及参考代码进行了详细讲解。原创 2025-03-20 15:33:58 · 1024 阅读 · 0 评论 -
算法基础——顺序表
本文介绍顺序表相关知识。顺序表是线性表的顺序存储,通过数组实现,有静态和动态两种分配方式,前者无需动态管理内存但易溢出或浪费空间,后者可按需分配但代码复杂、时间消耗大,算法竞赛多采用静态方式。接着模拟实现静态顺序表,包括创建、增删查改、清空等操作,还介绍了测试代码。为解决多顺序表操作复杂问题,可利用C++结构体和类封装静态顺序表。动态顺序表因实现复杂且效率低,算法竞赛常用C++ STL的vector,介绍了其创建、成员函数(size、empty、begin/end等)及测试代码。原创 2025-03-19 01:08:19 · 870 阅读 · 0 评论 -
手撕算法 ——前缀和
本文介绍前缀和相关算法,包括一维、二维前缀和及最大子段和、激光炸弹问题。一维前缀和可解决数组区间和问题,暴力法时间复杂,前缀和法通过创建数组 `f[i]=f[i−1]+a[i]` 快速求解,查询为 `f[r]−f[l−1]`;最大子段和通过前缀和数组,减前驱最小值求;二维前缀和可求子矩阵元素和,暴力法遍历慢,前缀和法套公式创建矩阵求解;激光炸弹用二维矩阵存目标价值,求前缀和矩阵,枚举边长为 `R` 子正方形最大值,注意位置重复和 `R` 超范围情况,各有参考代码。原创 2025-03-18 21:18:52 · 1465 阅读 · 0 评论 -
手撕算法——顺序表
该博客主要介绍了多种算法问题及相应解法。询问学号问题可直接用 vector 或数组模拟;寄包柜问题可通过创建二维数组(空间复杂度过高)或vector<int> a[N]解决,并解释了vector<int> a[N]与vector<int> a(N)的区别。移动零和颜色分类问题利用双指针,将数组分块处理。合并两个有序数组有辅助数组和原地修改两种解法。The Blocks Problem 是模拟题,用 vector 模拟,包括查找位置、木块归位、移动木块等操作,并给出了各问题的参考代码。原创 2025-03-12 00:01:47 · 909 阅读 · 0 评论 -
手撕算法——模拟
博客主要介绍了三个算法相关内容。一是多项式输出,采用模拟和分类讨论的方法,依次处理每一项的符号、系数和次数,通过判断系数正负、是否为 1 以及次数大小来输出结果。二是蛇形方阵,模拟填数过程,定义方向向量,按规则朝一个方向填数,越界后更新方向和位置,直至填完所有数。三是字符串的展开,依据详细规则模拟展开过程,考虑数字、字母及各种参数对字符处理的影响,通过分类讨论处理细节。每个算法都给出了对应的参考代码。原创 2025-03-04 18:34:44 · 1107 阅读 · 0 评论 -
手撕算法——高精度
博客围绕高精度运算展开,介绍了加、减、乘、除四种运算的算法。先以字符串读入大整数,再将其每一位拆分逆序存于数组。加法模拟列竖式相加,对应位累加、处理进位和余数;减法先判断大小让大数在前,对应位相减并处理借位,还要去除前导零;乘法模拟无进位相乘再相加,最后统一进位和处理前导零;除法模拟列竖式相除,用变量标记当前被除的数,计算商和余数,最后处理商的前导零,每种运算都给出了参考代码。原创 2025-03-04 21:31:27 · 780 阅读 · 0 评论
分享