自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 收藏
  • 关注

原创 无重复字符的最长子串(哈希表,队列)

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,...

2022-05-18 15:34:40 357

原创 平衡二叉树(AVL树)

平衡二叉树:是一种二叉排序树,其中每一个结点的左子树和右子树的高度差至多等于1 平衡因子:二叉树上结点的左子树深度减去右子树深度的值(因为是平衡二叉树,所以平衡因子的值只可能是-1、0、1) 最小不平衡子树:在插入结点时,距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树...

2022-05-17 16:49:43 590

原创 二叉排序树

二叉排序树(二叉搜索树、二叉查找树):它或者是一棵空树,或者是具有以下性质的二叉树。若它的左子树不空,则左子树上所有结点的值都小于它的根结点的值。若它的右子树不空,则右子树上所有结点的值都大于它的根结点的值。它的左右子树也分别为二叉排序树。查找操作:从根结点出发,用递归遍历二叉树,如果key<根结点T,则搜索其左子树,反之搜索其右子树,直到搜索成功,返回true,或者T为空,则返回false。代码:typedef struct BiNode{ ...

2022-05-14 22:07:50 402

原创 线性索引查找

索引:把一个关键字与它对应的记录相关联的过程。 线性索引(索引表):将索引项集合组织为线性结构。三种线性索引:1.稠密索引:将数据集中的每个记录对应一个索引项的线性索引。索引项一定是按照关键字有序的排列。索引表有序,所以也可以用折半,插值,斐波那契等有序查找算法。2.分块索引:分块有序:把数据集的记录分成若干块,且块内无序,块间有序(比如第二块所有记录的关键字比均大于第一块所有记录的关键字)。分块索引:对于分块有序的数据集...

2022-05-14 15:23:51 466

原创 有序表查找

1.折半查找(二分查找):前提:线性表中的记录的关键字有序排列(比如从小到大),线性表必须采取顺序存储。基本思想:在有序表中,取中间记录作为比较对象。若给定值与中间记录的关键字相等,则查找成功。若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功或查找失败。代码:int Binary_search(int *a,int n,int key) { int low=1; i...

2022-05-14 12:00:51 1056

原创 顺序表查找

查找表:是由同一类型的数据元素(或记录)构成的集合。(比如学生成绩表) 关键字:数据元素中某个数据项的值(键值)(学号,成绩,性别等) 主关键字:可以唯一地标识一个数据元素的关键字 (比如学生的学号) 次关键字:可以标识多个数据元素的关键字(比如学生的成绩,可能有多个学生的成绩一样) 查找:根据给定的值,在查找表中确定一个其关键字等于给定值的数据元素。(比如查找成绩为100的学生) 静态查找表:只做查找操作的查...

2022-05-14 10:10:22 3579

原创 机器人的运动范围(深度优先遍历与广度优先遍历)

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 1:输入:m = 2, n = 3, k = 1输出:3示例 2:..

2022-05-10 00:00:06 447

原创 矩阵中的路径(深度优先遍历)

。。。。

2022-05-07 09:13:55 786

原创 课程表(拓扑排序)

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。示...

2022-05-05 18:34:19 979

原创 二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树: 5 / \ 2 6 / \1 3示例 1:输入: [1,6,3,2,5]输出: false示例 2:输入: [1,3,2,6,5]输出: true提示:数组长度 <= 1000解题思路:递归分治后序遍历序列:左子树 ...

2022-05-05 08:21:22 173

原创 关键路径算法

AOE网:在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网称为AOE网。始点(源点):AOE网中没有入边的顶点汇点(终点):AOE网中没有出边的顶点关键路径:从源点到汇点具有最大长度的路径(关键路径是建立在拓扑序列的基础上,拓扑序列决定了工程的顺序,关键路径是在路径顺序不出错的情况下能极大程度影响到整个工期长短的路径)关键活动:关键路径上的活动关键路径算法原理:活动的最早开始时间与...

2022-05-04 21:59:19 2120

原创 拓扑排序算法

AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,称为AOV网。(AOV网中不能出现回路) 拓扑序列:设G(V,E)是一个有n个顶点的有向图,V中顶点序列V0,V1,V2,…,Vn,满足若从顶点Vi到Vj有一条路径,则在顶点序列中顶点Vi必定在顶点Vj之前。则这样的顶点序列称为拓扑序列。拓扑排序:对一个有向图构造拓扑序列的过程拓扑排序算法:对AOV网进行拓扑排序的基本思路:从AOV网中选一个入度为0的顶点...

2022-05-04 17:47:02 771

原创 最短路径算法

网图中的最短路径:两顶点之间经过的边上权值之和最少的路径。源点:路径上的第一个顶点终点:路径上的最后一个顶点迪杰斯特拉算法:算法流程:1.定义final数组,当已求得V0到某顶点的最短路径,则该顶点在final数组的下标的值计为1。2.初始化final数组和P数组,把它们所有元素的值全部初始化为0。3.D数组存储第0行的数据:[0,1,5,65535,65535,65535,65535,65535,65535],D[V0]=0,表示自己到自己的路径...

2022-05-04 16:47:51 1474

原创 最小生成树

最小生成树:n个顶点,用n条边构造连通网最小权值的生成树

2022-05-04 10:20:21 607

原创 图的深度优先遍历和广度优先遍历

图的遍历:从图中某一顶点出发访遍其余顶点且使每个顶点仅被访问一次。 1.深度优先遍历(深度优先搜索):DFS从图中某一顶点出发,访问此顶点然后访问其邻接点,直到图中所有和该顶点有路径相通的顶点都被访问。若图中还有未被访问到的顶点,则选其中一点继续重复上一过程,直到图中所有顶点都被访问。如图:使用深度优先遍历,选一顶点:A把所有和该顶点有路径相通的顶点都访问一遍,比如全部向右走,A→B→C→D→E→F→G→H,无路可走了,开始原路返回,返回到D时,访问 I ,...

2022-05-03 20:24:42 4470

原创 图的存储结构

1.邻接矩阵:用两个数组来表示图。一个一维数组存储图中顶点的信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。设图G有n个顶点,则邻接矩阵是一个n×n的方阵,定义为:mrc[i][j]=1,该边或弧存在则标为1 =0,不存在的边标为0主对角线的值都为0,因为不存在顶点到自身的边。arc[0][1]=1代表V0到V1的边存在,为零则代表该边不存在。因为是无向图,所以arc[0][1]=arc[1][0],是关于主对角线对称的,所以无向图的边数组是一个对...

2022-05-03 16:22:48 579

原创 之字型顺序打印二叉树(双端队列)

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [20,9], [15,7]]提示:节点总数 <= 1000解题思路:使用层序遍历二叉树,奇数...

2022-05-03 10:27:24 261

原创 图的定义与术语总结

图的定义:图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合。顶点:图的数据元素(结点)边:顶点之间的逻辑关系无向边:没有方向的边无向图:图中所有边都是无向边有向边(弧):有方向的边有向图:图中所有边都是有向边无向图中A到D的无向边可以表示为(A,D),也可以表示为(D,A)。有向图中A到D的有向边就是弧,A是弧尾,D是弧头,用<A,D>表示,A,D顺序不能换。...

2022-05-03 09:56:13 1914

原创 按层打印二叉树

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]提示:节点总数 <= 1000解题思路:层序遍历二叉树,循环把每层的结点全部存入数组,再把数组存入存储数组的数组。算法流程:...

2022-05-02 17:28:22 1297

原创 从上到下打印二叉树(层序遍历法)

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回:[3,9,20,15,7]提示:节点总数 <= 1000解题思路:使用层序遍历二叉树并把值存入数组中再输出。(层序遍历需要用到队列)算法流程:1.创建vector容器result存储要打印的值2.如果二叉树为...

2022-05-02 16:05:22 709

原创 对称的二叉树(递归)

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2/ \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3示例 1:输入:root = [1,2,2,3,4,4,3]输出:true示例 ...

2022-05-01 21:45:43 351

原创 二叉树的镜像(递归法、辅助栈法)

请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入: 4 / \ 2 7/ \ / \1 3 6 9镜像输出: 4 / \ 7 2/ \ / \9 6 3 1示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]限制:0 <= 节点个数 <= 1000解题思路:(递归法)二叉树的任意结点,设其左孩子为left...

2022-05-01 21:18:32 313

原创 赫夫曼树介绍

赫夫曼树(最优二叉树):带权路径长度(WPL)最小的二叉树。 路径:由树中一个结点到另一个结点之间的分支构成 路径长度:路径上的分支数目 树的路径长度:从树的根结点到每个结点的路径长度之和如图:根结点到结点D的路径长度为4该树的路径长度为:1+1+2+2+3+3+4+4=20带权路径长度(WPL)为:1×5+2×15+3×40+4×30+4×10=315该树并不是赫夫曼树,该如何构建赫夫曼树?赫...

2022-05-01 17:16:02 1194

原创 树的子结构(前序遍历法)

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3 / \ 4 5 / \1 2给定的树 B: 4 /1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。示例 1:输入:A = [1,2,3], B = [3,1]输出:false示例 2:输入...

2022-05-01 15:24:45 103

原创 树、森林与二叉树的转换

树转换为二叉树:1.在所有兄弟结点之间加一条连线2每个结点只保留其与第一个孩子的连线,与其他孩子的连线全部去掉3.顺时针旋转一定角度,使之结构分明注意:结点的第一个孩子是该结点的左孩子,结点的兄弟结点是该结点的右孩子。 森林转换为二叉树:森林:若干棵树集合1.把每棵树都转换为二叉树2.从第一棵树开始,后一棵的树都是前一棵的树的右孩子 二叉树转换为树:1.将每个结点的...

2022-05-01 10:59:08 1374

原创 重建二叉树(分治算法思想)

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。示例 1:Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output: [3,9,20,null,null,15,7]示例 2:Input: preorder = [-1], inorder = [-1]Output: [-1]限制:0 <= 节...

2022-05-01 09:59:20 179

原创 线索二叉树

线索:指向前驱的指针与指向后继的指针 线索链表:加上线索的二叉链表 线索二叉树:加上线索的二叉树 线索化:对二叉树以某种遍历使其变为线索二叉树的过程。因为普通的二叉树的指针域有一大半是指向空可以把这棵二叉树进行中序遍历,将所有空指针域中的rchild改为指向它的后继结点,所有空指针域中的lchild改为指向它的前驱结点。为了区分rchild是指向右孩子还是后继结点和lchild是指向左结点还是指向前驱结点,可以加两个指针变量ltag和rtag,...

2022-04-30 20:48:00 207

原创 二叉树的遍历

二叉树的遍历:从根结点出发,按某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。二叉树的遍历方法:(都用到递归)1.前序遍历:若二叉树为空,空操作返回,否则先访问根结点,再访问左子树,再访问右子树。如图:打印顺序为 ABDGHCEIF2.中序遍历:若二叉树为空,空操作返回,否则先从根结点出发(不是访问),先访问左子树,再访问根结点,最后访问右子树。如图:打印顺序为 GDHBAEICF3.后序遍历:若二叉树为空,空操作...

2022-04-30 18:01:01 307

原创 旋转数组的最小数字(二分查找)

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]]...

2022-04-30 11:28:32 188

原创 二叉树的存储结构

二叉树的定义:二叉树是n(n>=0)个结点的集合该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。 二叉树的特点:1.每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。2.左子树和右子树是有顺序的。3.即使树中某结点只有一颗子树,也要区分是左子树还是右子树。如图,树1和树2是同一棵树,但却是不同的二叉树。4.二叉树的基本形态空二叉树只有一个根结点(n=1)根结点只有左...

2022-04-30 10:00:26 2649

原创 树的存储结构

树的定义:树是n(n>=0)个结点的有限集,n为零时为空树。在非空树中,有且仅有一个根结点,当n>1时,其余结点可以分为m(m>0)个互不相交的有限集每一个集合又是一棵树,称为根的子树。结点的度:结点拥有的子树个数(比如结点A的度为2)叶结点(终端结点):度为0的结点 (比如结点G、H、I)分支结点(非终端结点):度不为0的结点内部结点:除了根结点之外的分支结点树的度:树内某个拥有最大度的结点的度(比如上图中树的度为...

2022-04-29 21:38:12 213

原创 斐波那契数列(动态规划法)

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:1示例 2:...

2022-04-29 19:39:34 794

原创 二维数组中的查找(二分查找)

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target =...

2022-04-29 13:07:41 1206

原创 从尾到头打印链表(栈与递归)

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]解题思路(辅助栈法):把链表翻转过来,很显然可以把链表的数据域存入栈中,利用栈的后进先出的特点,再存入数组就实现了翻转。算法流程:1.创建辅助栈st和数组arr2.用循环把链表的数据域存入栈st中3.用循环把栈中的元素存入数组arr中4.返回数组arr代码:class Solution {pub...

2022-04-29 09:38:59 480

原创 替换空格(字符串)

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = "We are happy."输出:"We%20are%20happy."解题思路:1.创建变量len存储字符串 s 长度,变量count 存储空格数量。2.创建变量 i 存储字符串 s 的最后一个元素的下标,变量 j 存储替换后的字符串 s 的最后一个元素的下标(替换后 s 的长度=len+2*count).3.循环( i<j ) 如果第 i 个元素不...

2022-04-27 17:46:31 336

原创 数组中重复的数字(哈希表,换位索引)

找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3解题思路1:哈希表1.创建一个哈希表2.遍历nums数组中每个元素 如果该元素在哈希表中的值为true 则...

2022-04-27 16:39:56 388

原创 滑动窗口最大值(双向队列)

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。示例 1:输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7...

2022-04-27 10:27:05 179

原创 朴素的模式匹配算法与KMP模式匹配算法

串的模式匹配:子串的定位操作 例如要从主串"goodgoogle"中到"google"这个子串的位置(第一个字符的位置)。朴素的模式匹配算法:也就是从主串的第一个元素开始循环一个子串的长度逐个比较,直到匹配成功或无法完成一个子串长度的循环。KMP模式匹配算法:...

2022-04-26 23:02:30 772

原创 串的存储结构

串的定义:串是由零个或多个字符组成的有限序列,又叫字符串。 空串:零个字符的串。 串的大小比较:1. 如果两个字符串相等,则它们的长度与每个对应位置的字符都一样,比如"abc"="abc"。2.如果两个字符串长度不同,且前 n 个字符都相等(n等于其中短的字符串的长度),则长的字符串比短的字符串大,比如"abcde">"abc"。3.除上述情况外,可以从左到右逐个比较其对应位置的字符的大小(按ASCII码的大小比较),出现第一个不等的就可...

2022-04-25 16:50:07 1256

原创 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop ...

2022-04-25 16:00:20 192

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除