- 博客(230)
- 收藏
- 关注
原创 腐烂的橘子-力扣
使用BFS来解决,保存一个腐烂的橘子队列并记录新鲜橘子的数目,对每个腐烂橘子从四个方向进行查找,如果是新鲜的橘子,就将其变为腐烂,加入队列。当新鲜橘子数组为0时,直接返回。
2024-08-20 10:48:23
262
原创 乘积最大子数组
局部变量使用double是因为测试用例[0,10,10,10,10,10,10,10,10,10,-10,10,10,10,10,10,10,10,10,10,0]
2024-08-17 15:02:45
104
原创 颜色分类-力扣
/ 2. 保持(right, nums.size() - 1]为2。// 如果做到以上两点, [left, right]必为1。// 1. 保持[0, left)为0。
2024-08-17 13:48:59
102
原创 搜索二维矩阵
这道题乍一看,和做过的搜索二维矩阵Ⅱ类似,用之前的代码也能通过,但忽略掉了每行的第一个整数大于前一行的最后一个整数这个条件。可以使用两次二分法来解决这道题目。
2024-08-12 23:27:56
311
原创 随机链表的复制
使用哈希表来保存每个节点对应的新节点的地址,先进行一遍遍历创建random都为0的链表,然后根据哈希表对复制链表节点的random进行赋值。
2024-07-23 19:16:22
123
原创 回文链表-链表
暴力解法复制一个新的链表出来并将其反转,然后挨个元素进行比较。比较是否是回文链表,实际上是在比较链表节点 val 的值是否相等,那么只需遍历一次链表,将其val存放在数组中,然后去判断这个数组是否回文。上述的写法都需要额外的空间来存放val,其实判断是否回文,只需要判断链表的前半部分和后半部分是否相等,那么只需要将链表的后半部分反转,然后依次进行比较,这样就不必花费额外的空间。可以使用快慢指针的方法找到链表后半部分的头节点。
2024-07-18 14:57:25
196
原创 缺失的第一个正数
将数组中所有小于等于0的数都置为 N + 1, 遍历数组,将此时将 nums[i] - 1 的下标对应的值变为负数,那么从前往后遍历到的第一个正数的下标,便是缺失的第一个正数。如果数组的数都是负数,说明数组中出现的正数恰好是 1 - N, 那么N + 1 便是我们需要找的数。
2024-07-16 19:35:32
492
原创 最长连续子序列
采用set对数组nums元素去重,然后遍历set元素,判断元素是否是连续序列的起始元素。如果是,则计算该元素起始序列的长度。因此set中每个元素只会被遍历一次。
2024-07-10 10:52:59
112
原创 小明逛公园-(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
966
原创 城市间货物运输Ⅲ-卡玛(Bellman_ford之单源有限最短路)
题目要求最多经过 k 个城市的条件下,而不是一定经过k个城市,也可以经过的城市数量比k小,但要最短的路径。对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离。那么经过 k 个城市,则共计 k + 1条边,那么最多需要松弛 k + 1次。使用队列优化后的 Bellman_ford 算法,关键在于 如何控制松弛 k 次,可以用一个变量 que_size 记录每一轮松弛入队列的所有节点数量。下一轮松弛的时候,就把队列里 que_size 个节点都弹出来,就是上一轮松弛入队列的节点。
2024-07-09 15:57:38
412
原创 城市间货物运输Ⅱ-卡玛(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
238
原创 城市间货物运输Ⅰ-卡玛(Bellman_ford 队列优化算法(SPFA))
Bellman_ford 算法每次松弛 都是对所有边进行松弛,但真正有效的松弛,是基于已经计算过的节点在做的松弛,所以 Bellman_ford 算法 每次都是对所有边进行松弛,其实是多做了一些无用功。一般来说,SPFA 的时间复杂度为 O(K * N) K 为不定值,因为 节点需要计入几次队列取决于 图的稠密度。如果图是一条线形图且单向的话,每个节点的入度为1,那么只需要加入一次队列,这样时间复杂度就是 O(N)。实际上 只需要对 上一次松弛的时候更新过的节点作为出发节点所连接的边 进行松弛就够了。
2024-07-09 11:54:39
361
原创 城市间货物运输Ⅰ-卡玛(Bellman_ford)
本题是经典的带负权值的单源最短路问题,Dijkstra 求单源最短路问题的前提是图中的边无负权重。当图中的边存在负权重时,就需要使用 Bellman_ford 算法来进行求解了。Bellman_ford算法的核心思想是 对所有边进行松弛n-1次操作(n为节点数量),从而求得目标最短路。本篇学习了代码随想录。
2024-07-09 11:01:40
411
原创 参加科学大会-卡玛(堆优化版Dijkstra)
与 Prim 类似,当节点数目较多,边的数量很小的时候(稀疏图),可以考虑从边的角度来求最短路,邻接矩阵遇到稀疏图,会导致申请过大的二维数组造成空间浪费 且遍历 边 的时候需要遍历整个n * n矩阵,造成时间浪费。而在朴素版Dijkstra中,需要一个for循环来遍历节点,并找出未访问节点,然后对每个为访问节点更新minDist数组,即源点到为访问节点的最小权重。如果采取小顶堆来存放边,并按照边权重的大小进行排序,那么我们每次从堆中取出的边便是权重最小的边,那么就无须花费两层for循环来寻找最近的节点了。
2024-07-08 22:03:53
725
原创 参加科学大会-卡玛(朴素版Dijkstra)
dijkstra算法:在有权图(权值非负数)中求从起点到其他节点的最短路径算法。dijkstra 算法可以同时求起点到所有节点的最短路径;本文学习了就代码随想录。
2024-07-08 20:56:35
297
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人