- 博客(213)
- 收藏
- 关注
原创 随机链表的复制
使用哈希表来保存每个节点对应的新节点的地址,先进行一遍遍历创建random都为0的链表,然后根据哈希表对复制链表节点的random进行赋值。
2024-07-23 19:16:22
16
原创 回文 链表
暴力解法复制一个新的链表出来并将其反转,然后挨个元素进行比较。比较是否是回文链表,实际上是在比较链表节点 val 的值是否相等,那么只需遍历一次链表,将其val存放在数组中,然后去判断这个数组是否回文。上述的写法都需要额外的空间来存放val,其实判断是否回文,只需要判断链表的前半部分和后半部分是否相等,那么只需要将链表的后半部分反转,然后依次进行比较,这样就不必花费额外的空间。可以使用快慢指针的方法找到链表后半部分的头节点。
2024-07-18 14:57:25
149
原创 缺失的第一个正数
将数组中所有小于等于0的数都置为 N + 1, 遍历数组,将此时将 nums[i] - 1 的下标对应的值变为负数,那么从前往后遍历到的第一个正数的下标,便是缺失的第一个正数。如果数组的数都是负数,说明数组中出现的正数恰好是 1 - N, 那么N + 1 便是我们需要找的数。
2024-07-16 19:35:32
457
原创 最长连续子序列
采用set对数组nums元素去重,然后遍历set元素,判断元素是否是连续序列的起始元素。如果是,则计算该元素起始序列的长度。因此set中每个元素只会被遍历一次。
2024-07-10 10:52:59
77
原创 小明逛公园-(Floyd 算法)
从递推公式:grid[i][j][k] = min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1]) 可以看出,我们需要三个for循环,分别遍历i,j 和k。那么我们只需要记录 grid[i][j][1] 和 grid[i][j][0] 就好,之后就是 grid[i][j][1] 和 grid[i][j][0] 交替滚动。– 节点i 到 节点j 的最短路径不经过节点k,grid[i][j][k] = grid[i][j][k - 1]
2024-07-09 20:42:55
904
原创 城市间货物运输Ⅲ-卡玛(Bellman_ford之单源有限最短路)
题目要求最多经过 k 个城市的条件下,而不是一定经过k个城市,也可以经过的城市数量比k小,但要最短的路径。对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离。那么经过 k 个城市,则共计 k + 1条边,那么最多需要松弛 k + 1次。使用队列优化后的 Bellman_ford 算法,关键在于 如何控制松弛 k 次,可以用一个变量 que_size 记录每一轮松弛入队列的所有节点数量。下一轮松弛的时候,就把队列里 que_size 个节点都弹出来,就是上一轮松弛入队列的节点。
2024-07-09 15:57:38
358
原创 城市间货物运输Ⅱ-卡玛(Bellman_ford之判断负权回路)
如果是队列优化过的 Bellman_ford 算法,在极端情况下,即:所有节点都与其他节点相连,每个节点的入度为 n-1 (n为节点数量),所以每个节点最多加入 n-1 次队列。利用一个数组来记录每个节点的出现次数,如果某个节点出现次数超过了 n - 1次,就说明该图存在负权回路。Bellman_ford算法最多对每条边进行 n - 1 次松弛,n 为图中节点个数,就可以得到从源点到 n 的最短路径,那么对每条边进行第 n - 1次松弛,如果 minDist 数组还会更新的话,那么就说明图中存在负权回路。
2024-07-09 14:28:51
181
原创 城市间货物运输Ⅰ-卡玛(Bellman_ford 队列优化算法(SPFA))
Bellman_ford 算法每次松弛 都是对所有边进行松弛,但真正有效的松弛,是基于已经计算过的节点在做的松弛,所以 Bellman_ford 算法 每次都是对所有边进行松弛,其实是多做了一些无用功。一般来说,SPFA 的时间复杂度为 O(K * N) K 为不定值,因为 节点需要计入几次队列取决于 图的稠密度。如果图是一条线形图且单向的话,每个节点的入度为1,那么只需要加入一次队列,这样时间复杂度就是 O(N)。实际上 只需要对 上一次松弛的时候更新过的节点作为出发节点所连接的边 进行松弛就够了。
2024-07-09 11:54:39
303
原创 城市间货物运输Ⅰ-卡玛(Bellman_ford)
本题是经典的带负权值的单源最短路问题,Dijkstra 求单源最短路问题的前提是图中的边无负权重。当图中的边存在负权重时,就需要使用 Bellman_ford 算法来进行求解了。Bellman_ford算法的核心思想是 对所有边进行松弛n-1次操作(n为节点数量),从而求得目标最短路。本篇学习了代码随想录。
2024-07-09 11:01:40
358
原创 参加科学大会-卡玛(堆优化版Dijkstra)
与 Prim 类似,当节点数目较多,边的数量很小的时候(稀疏图),可以考虑从边的角度来求最短路,邻接矩阵遇到稀疏图,会导致申请过大的二维数组造成空间浪费 且遍历 边 的时候需要遍历整个n * n矩阵,造成时间浪费。而在朴素版Dijkstra中,需要一个for循环来遍历节点,并找出未访问节点,然后对每个为访问节点更新minDist数组,即源点到为访问节点的最小权重。如果采取小顶堆来存放边,并按照边权重的大小进行排序,那么我们每次从堆中取出的边便是权重最小的边,那么就无须花费两层for循环来寻找最近的节点了。
2024-07-08 22:03:53
682
原创 参加科学大会-卡玛(朴素版Dijkstra)
dijkstra算法:在有权图(权值非负数)中求从起点到其他节点的最短路径算法。dijkstra 算法可以同时求起点到所有节点的最短路径;本文学习了就代码随想录。
2024-07-08 20:56:35
256
原创 软件构建-卡玛
如果我们发现结果集元素个数 不等于 图中节点个数,我们就可以认定图中一定有 有向环。循环以上两步,直到 所有节点都在图中被移除了。本篇学习了代码随想录。
2024-07-08 19:00:14
137
原创 寻宝-卡玛-Kruskal算法
上一篇学习了最小生成树的Prim算法,这一篇是对最小生成树 Kruskal 算法的学习。在代码实现中使用了 并查集 和 lambda表达式。
2024-07-08 16:41:59
215
原创 寻宝-卡玛-Prim算法
最小生成树是所有节点的最小连通子图, 即:以最小的成本(边的权值)将图中所有节点链接到一起。图中有n个节点,那么一定可以用 n - 1 条边将所有节点连接到一起。第三步,更新非生成树节点到生成树的距离(即更新minDist数组),minDist数组 用来记录 每一个节点距离最小生成树的最近距离。本题是最小生成树的相关题目,最小生成树的题目可以由 Prim 算法 和 Kruskal 进行解答。prim算法 是从节点的角度 采用贪心的策略 每次寻找距离 最小生成树最近的节点 并加入到最小生成树中。
2024-07-08 15:44:52
337
原创 冗余连接Ⅱ-卡玛
本体可以描述为有一个有向图,是由一颗有向树 + 一条有向边组成的 (所以此时这个图就不能称之为有向树),现在让我们找到那条边 把这条边删了,让这个图恢复为有向树。看了这道题没什么思路,学习了代码随想录。
2024-07-07 19:05:21
107
原创 冗余连接-卡玛-力扣
输出一条可以删除的边。如果有多个答案,请删除标准输入中最后出现的那条边。如果边的两个节点已经出现在同一个集合里,说明着边的两个节点已经连在一起了,再加入这条边一定就出现环了。现给定一个拥有 n 个节点(节点标号是从 1 到 n)和 n 条边的连通无向图,请找出一条可以删除的边,删除后图可以变成一棵树。那么从前向后将边加入并查集,如果要加入的边的节点已经在并查集中,那么就将其删掉。树可以看成是一个图(拥有 n 个节点和 n - 1 条边的连通无环无向图)。
2024-07-07 16:03:52
161
原创 寻找存在的路径-卡玛
本题是要寻找无向图是否存在从 s 到 t 的一条路径,那么选择从 s 出发,进行深度搜索,只要能到达 t ,就说明存在路径。
2024-07-07 14:22:54
281
原创 岛屿的周长-卡玛
遍历每一个空格,遇到陆地则计算其上下左右的空格情况。如果该陆地上下左右的空格是水域或者越界了,则说明是一条边,将这些边累加起来便是岛屿的周长。
2024-07-05 17:18:33
152
原创 字母串接龙-卡玛
本体需要判断两个字符之间是不是差一个字符,如果差一个字符,那就是存在连接。那么不同的字符串之间,就能够构成一幅无向图,需要求的问题就转化为 起点和终点的最短路径长度。无向图的最短路径,选择广度优先而非深度优先,因为广度优先搜索,那么首先得到的路径就是最短的路径,而深度搜索则还需要去对比搜索得到的路径的长度。
2024-07-05 15:48:38
159
原创 孤岛的总面积-卡玛
那么如果一个岛屿不是孤岛,那么其在搜索时,一定会产生越界,利用一个标记位来对越界进行标记,如果产生越界就不统计这个岛的面积。本题需要求的是孤岛的面积,孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。
2024-07-04 15:16:16
153
原创 岛屿的最大面积-卡玛
本题与岛屿的数量区别在于需要统计每个岛屿的面积大小,并保留岛屿的面积最大值,那么在遍历每个岛屿的时候,遇到所有的陆地节点总和便是岛屿的面积,记录即可。自己使用了返回值作为记录,代码随想录。则将计数变量作为全局变量,在主函数遇到新岛屿时归零,重新计数。
2024-07-04 14:11:47
191
原创 岛屿数量-卡玛
对于每一个节点,搜索时,需要向其上下左右四个反向进行搜索,使用 int dir[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};来记录上下左右四个方向,使用一个 vector 来记录已经遍历过的节点,搜索时遇到已经遍历的节点,或者越界的节点就停止。本题思路,是用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋节点的时候直接跳过。这样计数器就是最终岛屿的数量。这次学习了代码随想录。
2024-07-04 11:10:08
251
原创 柱状图中最大的矩形-力扣
因此,思路就是找到每个元素左边第一个比它矮的矩形和右边第一个比它矮的矩形,在这中间的就是最大宽度。单调栈的经典应用场景是,在一维数组中,对每一个数字,找到前/后面第一个比自己大/小的元素。对数组中的每个元素,若假定以它为高,能够展开的宽度越宽,那么以它为高的矩形面积就越大。最后对每个元素遍历一遍找到最大值即可。
2024-07-03 11:11:58
139
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人