
数据结构与算法
文章平均质量分 79
总结了数据结构与算法的学习
神烦狗闯入了你的博客
人是万灵之长,智慧的差异很小,经历,本身也是一种文化。
展开
-
LeetCode 二叉树的遍历
二叉树遍历用递归时间很简单,只需要调整递归调用方法的顺序即可。而迭代的方式需要一个栈的结构来辅助完成,需要注意的是入栈和出栈的时机,同时需要记住每经过一个节点,就要将其入栈。...原创 2022-08-03 18:25:17 · 301 阅读 · 0 评论 -
二分查找总结
总结二分学习边界问题,以及模板的使用。原创 2022-08-11 19:03:44 · 318 阅读 · 0 评论 -
堆与堆排序
堆与堆排序什么是堆?堆的逻辑结构是一棵平衡二叉树,但是在使用过程中使用数组来进行存储。我们还可以将堆分成两种类型,大根堆和小根堆。大根堆是希望大的元素处于根部的位置,树中每层结点的值随着层数的增加而减小,而小根堆则相反。堆的存储使用一维数组来存储堆,根结点与左右孩子的下标关系:根结点 x ,左孩子 2x,右孩子 2x+1对堆的两个基本的操作:down(向下调整) 和 up(向上调整)down:void down(int x) { int t = x; if原创 2022-03-21 20:23:16 · 684 阅读 · 0 评论 -
最小生成树 (Prim、Kruskal)
介绍了最小生成树的两个经典算法Prim算和Kruskcal算法。原创 2022-03-21 20:03:08 · 138 阅读 · 0 评论 -
二分图 (染色法判断二分图、匈牙利算法)
二分图二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。染色法判断二分图给定一个 nnn 个点 mmm 条边的无向图,图中可能存在重边和自环。请你判断这个图是否是二分原创 2022-03-21 17:18:22 · 497 阅读 · 0 评论 -
最短路径问题
Dijkstra算法、Bellman-Ford算法、SPFA算法、Floyd算法基本原理,实际使用。原创 2022-03-19 16:41:57 · 605 阅读 · 1 评论 -
Dijkstra算法
Dijkstra算法简介迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。Dijkstra主要用于解决单源最短路问题。单源最短路问题:从一个源点到其它点的最短距离叫作单源最短路径问题。朴素Dijkstra算法给定一个 nnn 个点 mmm 条原创 2022-03-17 13:27:44 · 1092 阅读 · 0 评论 -
DFS 深度优先搜索
DFS 深度优先搜索基本概述DFS (Depth First Search) 深度优先遍历 俗称暴搜数据结构 stack 空间 O(h)O(h)O(h)不具有最短性DFS本质上就是递归,要想学会DFS就要理解好递归。递归就是"自己"调用"自己"的过程,但是一定要设置递归的终止条件,调用函数的过程就是将函数进行压栈执行,如果不设置终止条件,函数就会不断的调用自己,也就是一直压栈下去,最终爆栈。重要的点有三个:递归终止条件如何设置返回值应该是什么,该传递给上一层什么信息这一层的递原创 2022-03-05 19:36:40 · 468 阅读 · 0 评论 -
并查集 Disjoint Set Union (DSU)
并查集 Disjoint Set Union (DSU)并查集的功能将两个集合合并询问两个元素是否在一个集合当中基本原理每个集合用一棵树来表示。树的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点。三个问题如何判断树根 p[x] = x如何求元素x的根节点 while(p[x] != x) x = p[x]如何合并两个集合,比如合并元素x和y所在的集合 找到x的根节点p[x],p[y]的根节点p[y] ,p[px] = py并查集核心操作find()数组原创 2022-03-02 08:03:35 · 342 阅读 · 1 评论 -
Trie树
介绍了字典树Trie树的主要内容,结合图片、文字和代码解释了Trie的构建以及使用方式。原创 2022-02-23 14:29:06 · 395 阅读 · 2 评论 -
KMP算法图文详解
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。**KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。**具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。原创 2022-02-19 21:07:30 · 1740 阅读 · 0 评论 -
单调队列 (Sliding Window)
单调队列单调对列是单调递减或单调递增的队列。也就是在队列性质的基础上,维护一个单调的序列。例题:acwing 154. 滑动窗口给定一个大小为 n≤10^6 的数组。有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到 k 个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为 [1 3 -1 -3 5 3 6 7],k 为 3。窗口位置最小值最大值[1 3 -1] -3 5 3 6 7-131 [3 -1 -3] 5 3原创 2022-02-18 16:48:09 · 158 阅读 · 0 评论 -
单调栈 (Monotone Priority Stack)
单调栈单调栈如其名,在栈中的元素都按递增或者递减的顺序进行排序,而在解题过程中使用单调栈的好处就是因为单调栈的时间复杂度是线性的,每个元素就只会遍历一遍。如: acwing 830. 单调栈给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。输入格式第一行包含整数 N,表示数列长度。第二行包含 N 个整数,表示整数数列。输出格式共一行,包含 N 个整数,其中第 i 个数表示第 i 个数的左边第一个比它小的数,如果不存在则输出 −1。数据范围1≤N≤1原创 2022-02-18 16:41:27 · 633 阅读 · 0 评论 -
数组实现链表和双链表
链表是一种线性表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是原创 2022-02-16 12:03:58 · 1264 阅读 · 3 评论 -
二分搜索算法 (binary search)
二分搜索算法二分的本质并不是单调性,但是具有单调性一定可以使用二分,可以使用二分不一定具有单调性。二分的要点是"边界问题"二分算法看似很容易实现,但是对于处理二分的边界上的细节时却十分复杂。所以使用二分算法之前需要根据实际问题进行建模,根据不同的性质设置判断条件,划分红蓝区域,最终定位边界。请看下图:找出蓝色的边界的数字和红色边界的数字。可以将图中的一串数字根据颜色的不同,而划分成红蓝两个区域,可以使用通过二分法来确定红蓝区域的边界。两头分别设立两个指针,l 和 r ,l 是从左相向右扫描原创 2022-02-15 16:19:29 · 4823 阅读 · 1 评论 -
前缀和与差分
前缀和与差分前缀和什么是前缀和?前缀和(Prefix Sum)的定义为:对于一个给定的数列 A, 它的前缀和数列 S 是通过递推能求出来得 部分和。例如:A = {1, 2, 3, 4, 5}S = {1, 3, 6, 10, 15}即:Sn = a1 + a2 + a3 + … + an类似于数列的前N项和。如 acwing 795. 前缀和// n 表示数组的长度,但是实际数组的长度是 n + 1, 这是为了for循环中 i 是以 1 开始的,防止出现边界问题,在数组下标为原创 2022-02-10 16:38:47 · 634 阅读 · 0 评论