- 博客(16)
- 收藏
- 关注
原创 广度优先搜索(BFS)
BFSBFS*广度优先搜索(Breadth-First Search)*是一种用于遍历或搜索 图 / 树 的算法。BFS的是 “地毯式” 的层次遍历 ,它确保在无权图(或边权相同的图)中,第一次到达某个节点时所走的路径,就是从起点到该节点的最短路径。例如:从一栋公寓的顶楼开始,探索每一层的所有房间,要一层一层的往下走。关键的实现核心在于的使用,即**先进先出(FIFO)**的核心思想,先入队的会被先访问,正满足一层一层遍历的需求。BFS的核心即是BFS。
2026-03-08 11:28:44
274
原创 递归回溯法
回溯本质上属于深度优先搜索(DFS,运用到的思想是暴力枚举+剪枝从字面意思也很好理解,他的步骤就是**<枚举所有的可能,边枚举边验证,无效则回退>**显然在一些需要穷举所有可能的题就能用上。其中我们一般会定义一个char* path或int* path作为一次路径探索的容器即一次被探索(构建)完成(满足问题条件)的path代表一种完全可能(满足条件的一种可能的答案)// 通用回溯模板(伪代码)void backtrack(路径, 选择列表, 结果集) {if(触发限制条件)return;// 剪枝。
2025-12-11 18:32:00
944
原创 理解哈希表
对于哈希节点:由于只需要记录这个数字的每个位置数字平方和是否出现过,所以key即val,一个内容即可当成两个含义,既是索引又是实际用来判断是否重复出现从而进入死循环的值。对于最大容量:由于出现的数字最大是10位数,那么每个数字每个位置上数字的平方和最大不超过9^2 * 10即810,所以取最近的更大质数829作为最大容量。此时不再是像之前一样找一个新的空格子,而是由原来每个简单的格子(结构体,存单种键值对),变成了自带许多夹层的高级格子(链表),显然,这种概念针对的是每个具体的元素的存储情况或存储环境。
2025-12-07 13:53:14
553
原创 前缀和的预处理技巧
可以发现,如果像上面这样使用区间和,有时容易混淆原始数组的下标、前缀和数组的下标,以及第几个元素的区别,也容易出现边界漏判、误判导致越界的情况;简单总结,前缀和是一种通过空间换时间的预处理技巧,在处理大量区间和查询的情况下能起到巨大作用,容易混淆和需要注意的就是。和一维前缀和数组的优化方式类似,只不过对于二维前缀和数组来说,第一行和第一列的所有元素都是哨兵,这样,其大小就变为。顾名思义,二维前缀和就是二维数组(矩阵)的前缀和,此时的前缀和数组也是一个二维数组(矩阵),其中。1.创建二维前缀和数组递推计算。
2025-11-24 19:11:12
787
原创 归并排序法
基于以上,归并排序是一种较为稳定的排序方法,可以在更追求时间稳定、对原始顺序有依赖、数据结构不支持随机访问的场景使用,在对链表排序的时候具有一定优势。,这导致在进行链表排序时,那些依赖依赖通过随机访问(通过下标取元素访问)的排序算法难以解决或者解决时间变得过长而失去意义,例如快速排序、堆排序等。便于实现合并的过程。合并:将两个有序的子数组相对排序合并为一个更大的有序数组,重复这个合并的过程直到合并回完整的数组。实际上,归并函数有两种实现方式,一种为递归,一种为迭代。而归并排序的**“分->找链表中点”
2025-11-22 20:56:07
506
原创 栈与队列基础学习
实战中,我们并不是死板的定义栈、出栈、入栈函数,而是要理解栈应该用于判断什么,要知道什么信息要用栈的特点去找,而什么信息只需要简单的存起来就行,不能死板的纠结于入栈、出栈函数该怎么写,而是应该只。,而他们的特征正好相反,队列的特点是**“先进先出”**,你可以想象成一个两头通的管子,左边永远用来入队数据,右边永远用来出队数据。链式栈并非在链表尾部插入新节点,而是在链表头插入新节点,新节点变为新的头节点,也就是新的栈顶位置,而原节点变为后继节点。每个右括号都有一个对应的相同类型的左括号。
2025-11-16 12:30:12
616
原创 C语言的文件操作
比如程序运行时的数据存储在内存中,且程序结束后内存会被释放,而依靠文件操作我们就可以实现数据的长期保存。除此之外,文件操作还便于数据的共享和传输,比如多个程序可以通过读写同一个文件交换数据。在 C 语言中,文件是存储在外部存储介质(如硬盘、U 盘等)上的数据集合。那么要对文件进行操作,我们就需要一样东西明确的指向文件的各种信息来修改它,这就是。首先,要进行二进制的读写,打开文件的方式需要用二进制形式,即。相对路径:以当前程序的运行目录为起点,描述文件位置的路径。书写注意:在程序内书写时,文件路径中的。
2025-11-09 11:35:13
925
原创 链表的学习
基本的,我们可以正向遍历、反向遍历(需特殊操作)、带条件遍历(如查找特定值)等。,包括处理这些数据的存储形式和存储地址,处理各个数据之间的关系,以及如何操作这些数据(如增删查改)。),因为要修改头指针本身(一级指针变量),若用一级指针,修改只在函数内部生效,外部头指针不会变。而对于带有头节点的链表来说,要删增首元节点的时候,只需修改头节点的next,统一操作。⭐写一个“创建新节点”的函数配合用,同时方便后续新节点建立的操作。同样的,对于想要删除一个节点来说,也要。利用数组,正向存入,靠数组反向遍历。
2025-11-02 16:58:29
867
原创 二分法的学习
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。2.二分比较:计算mid = left + (right - left)/2(避溢出),对比mid与目标/条件。3.缩范围:排除无效半段,更新left或right,重复直到找到结果或范围为空。**注意:**不允许使用任何内置指数函数和算符,例如。边界查找:找到目标不立即返回,需继续收缩范围。适用场景:查找类、边界类、数值范围类问题。(数组适用,链表不适用)(左闭右开),不可混用。
2025-11-02 16:48:09
271
原创 双指针的学习
轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。给你一个链表和n,删除倒数第n个节点,返回删除后的链表的头指针。删除重复元素(经典一个在前面判断一个在后面记录的滑动窗口)(关键前提),避免后续重复结果,且能使用反向双指针。** 删除重复出现的元素,使每个元素。进行更高效的遍历、检查、判断,以达到。,返回删除后数组的新长度。:顾名思义,双指针的本质是——通过。去重后,返回唯一元素的数量。(2)找到环形链表的入口节点。之后的剩余元素可以忽略。返回所有不重复的三元组。中最长的 回文 子串。
2025-11-02 16:47:30
866
原创 结构体学习
结构体指针与结构体数组联系紧密,结构体指针可以指向结构体数组的首元素或任意元素,通过指针的移动(指针运算)能高效访问和操作数组中的所有结构体元素,这在处理批量数据时非常实用。结构体是一种用户自定义的数据类型,它允许我们将多个不同类型的变量组合在一起,形成一个新的、有意义的数据单元。这种方式可以不按成员定义的顺序,通过 “成员名 = 值” 的形式明确指定要初始化的成员,未指定的成员同样会被赋予默认值。嵌套结构体的定义需要先定义内部结构体(被嵌套的结构体),再在外部结构体中声明该类型的成员。
2025-10-26 10:38:41
684
原创 大小端学习
(即大小端涉及的字节顺序)。两种情况的 “高低” 判断逻辑一致,都基于 “权重”。:数值越大的地址,称为 “高地址”;数值越小的地址,称为 “低地址”。一个字节有 8 位(bit),从右到左(或从左到右)编号为 0~7。)由多个字节组成,每个字节的 “高低位” 取决于它对整个数据的。我们常说的 “高低位”,既可以指。
2025-10-26 10:38:10
241
原创 指针的学习
而指针与二维数组的关联,核心是理解 “不同层级的数组名,对应不同类型的指针”。野指针是 “指向非法内存地址的指针”—— 它要么没被初始化(存的是随机地址),要么指向的内存已被释放(地址失效),总之通过它解引用会访问非法内存。(n 是列数),刚好和数组指针类型匹配 —— 数组指针最常用的场景就是指向二维数组的 “行”,遍历二维数组。是 “专门存放一级指针地址的指针”—— 可以理解为 “指针的指针”,本质是对指针地址的再次封装。前面学过 “一级指针作为参数,无法修改自身的指向”(因为传的是地址副本),而。
2025-10-26 10:32:11
586
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅