自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 437. 路径总和 III

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。本题采用遍历每个节点开始的路径的思路,递归所有可能的结果,然后把总数加起来。

2024-07-19 10:18:14 99

原创 114. 二叉树展开为链表

展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null。展开后的单链表应该与二叉树 先序遍历 顺序相同。

2024-07-18 11:13:14 145

原创 230. 二叉搜索树中第K小的元素

但我们可以不遍历整棵树,使用中序遍历(迭代算法),使用栈存放节点。首先向左子树遍历,遍历到root为空,然后回溯,再遍历右子树,这样保证了迭代数值的大小。给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。本题我原本的思路是将所有的节点按大小存入数组中,然后返回第k个值。

2024-07-17 21:47:33 174

原创 146. LRU 缓存

2.对于 put 操作,首先判断 key 是否存在:如果 key 不存在,使用 key 和 value 创建一个新的节点,在双向链表的头部添加该节点,并将 key 和该节点添加进哈希表中。如果 key 存在,则与 get 操作类似,先通过哈希表定位,再将对应的节点的值更新为 value,并将该节点移到双向链表的头部。上述各项操作中,访问哈希表的时间复杂度为 O(1),在双向链表的头部添加节点、在双向链表的尾部删除节点的复杂度也为 O(1)。如果 key 存在,则 key 对应的节点是最近被使用的节点。

2024-07-17 09:53:55 290

原创 138. 随机链表的复制

深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。本题利用哈希表的查询特点,考虑构建 原链表节点 和 新链表对应节点 的键值对映射关系,再遍历构建新链表各节点的 next 和 random 引用指向即可。给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

2024-07-16 22:24:30 281

原创 2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。本题我采用重新建立一个链表来储存结果,链表节点值等于两个链表值的相加,并考虑是否进位。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。请你将两个数相加,并以相同形式返回一个表示和的链表。

2024-07-15 17:29:54 152

原创 142. 环形链表 II

那么相遇时: slow指针走过的节点数为: x + y, fast指针走过的节点数:x + y + n (y + z),n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。因为要找环形的入口,那么要求的是x,因为x表示 头结点到 环形入口节点的的距离。当 n为1的时候,公式就化解为 x = z,这就意味着,从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。如果链表无环,则返回 null。

2024-07-15 11:13:30 217

原创 240. 搜索二维矩阵 II

我们可以从矩阵 matrix 的右上角 (0,n−1) 进行搜索。编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。在搜索的过程中,如果我们超出了矩阵的边界,那么说明矩阵中不存在 target。

2024-07-14 16:47:01 113

原创 48. 旋转图像

如上图所示,一轮可以完成矩阵 4 个元素的旋转。因而,只要分别以矩阵左上角 1/4 的各元素为起始点执行以上旋转操作,即可完整实现矩阵旋转。给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。具体来看,当矩阵大小。

2024-07-14 16:01:11 159

原创 54. 螺旋矩阵

2.其次向右移动到最右,此时第一行因为已经使用过了,可以将其从图中删去,体现在代码中就是重新定义上边界。给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。4.若上下边界不交错,则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理。3.判断若重新定义后,上下边界交错,表明螺旋矩阵遍历结束,跳出循环,返回答案。5.不断循环以上步骤,直到某两条边界交错,跳出循环,返回答案。1.首先设定上下左右边界。

2024-07-14 15:04:29 116

原创 73. 矩阵置零

本题用两个标记数组分别记录每一行和每一列是否有零出现。首先遍历该数组一次,如果某个元素为 0,那么就将该元素所在的行和列所对应标记数组的位置置为 true。最后再次遍历该数组,用标记数组更新原数组即可。给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0。请使用 原地 算法。

2024-07-14 14:29:43 171

原创 41. 缺失的第一个正数

因此,对数组进行遍历,对于遍历到的数 x,如果它在 [1,N] 的范围内,那么就将数组中的第 x−1 个位置(注意:数组下标从 0 开始)打上「标记」。在遍历结束之后,如果所有的位置都被打上了标记,那么答案是 N+1,否则答案是最小的没有打上标记的位置加 1。注意如果它已经有负号,不需要重复添加;这是因为如果 [1,N] 都出现了,那么答案是 N+1,否则答案是 [1,N] 中没有出现的最小正整数。3.在遍历完成之后,如果数组中的每一个数都是负数,那么答案是 N+1,否则答案是第一个正数的位置加 1。

2024-07-14 13:47:28 175

原创 238. 除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。本题使用三个数组,L用来记录i左侧所有元素的乘积,R来记录右侧所有元素的乘积,answer记录结果。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。,且在 O(n) 时间复杂度内完成此题。

2024-07-14 11:49:43 195

原创 189. 轮转数组

因此可以先将所有元素翻转,这样尾部的 k mod n 个元素就被移至数组头部,然后我们再翻转 [0, (k mod n) − 1 ] 区间的元素和 [k mod n, n − 1 ] 区间的元素即能得到最后的答案。用 n 表示数组的长度,遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k)modn 的位置,最后将新数组拷贝至原数组即可。但是翻转数组来得到结果会更加容易,当将数组的元素向右移动 k 次后,尾部 k mod n 个元素会移动至数组头部,其余元素向后移动 k mod n 个位置。

2024-07-13 21:18:24 199

原创 76. 最小覆盖子串

本题的思想是哈希+滑动窗口,使用哈希构建sStr(s子串中字符出现次数)和tStr(t字符串中字符出现次数),如果sStr能够覆盖tStr,则当前子串符合条件,记录当前子串左端位置和长度,以便最后分割子串,并将子串左端位置右移一位;如果不能覆盖,则将子串右端位置右移一位。给你一个字符串 s 、一个字符串 t。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “”。

2024-07-13 10:47:08 153

原创 560. 和为 K 的子数组

在遍历的过程中,我们检查是否存在Sum[j] - k的前缀和,如果存在,说明从某个位置到当前位置的连续子数组的和为k,我们将对应的次数累加到结果中。这样,通过遍历一次数组,我们可以统计出和为k的连续子数组的个数,并且时间复杂度为O(n),其中n为数组的长度。那么对于任意的两个下标i和j(i < j),如果Sum[j] - Sum[i] = k,即从第i个位置到第j个位置的元素之和等于k,那么说明从第i+1个位置到第j个位置的连续子数组的和为k。子数组是数组中元素的。

2024-07-12 17:07:06 103

原创 438. 找到字符串中所有字母异位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。本题我原本的思路是遍历s的下标,然后截取p长度的子串和p进行比较,但超出时间限制。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

2024-07-12 13:14:30 150

原创 3. 无重复字符的最长子串

若ringht所指字符未出现过,则将当前子串长度与最长子串长度作对比,然后把当前字符加入set容器中,right右移。本题采用滑动窗口法解题,left指向子串左端,right指向子串右端,使用set容器记录出现过的字符。若right所指字符出现过,则将left所指字符从容器中删除,left右移。给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。

2024-07-11 21:22:15 113

原创 15. 三数之和

接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i],b = nums[left],c = nums[right]。给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!

2024-07-11 14:02:20 121

原创 11. 盛最多水的容器

给定一个长度为 n 的整数数组 height。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。本体采用双指针法,刚开始左右指针分别指向左右两端,然后移动两者中较小的那个数。因为容器的高等于两者中较小的数,容器的宽等于两者下标的差值,若移动较大的数,则宽小于之前的宽,高小于等于之前的高,容器值只会越来越小,所以移动较小的那个数。

2024-07-11 13:43:13 174

原创 97. 小明逛公园(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][k] = min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1])对于第一种情况,grid[i][j][k] = grid[i][k][k - 1] + grid[k][j][k - 1]

2024-07-09 17:48:20 486

原创 96. 城市间货物运输 III(bellman_ford之单源有限最短路)

而且对所有边的后面几次松弛,同样是更新了所有的节点,说明 至多经过k 个节点 这个限制 根本没有限制住,每个节点的数值都被更新了。输出描述:输出一个整数,表示从城市 src 到城市 dst 的最低运输成本,如果无法在给定经过城市数量限制下找到从 src 到 dst 的路径,则输出 “unreachable”,表示不存在符合条件的运输方案。注意题目中描述是 最多经过 k 个城市的条件下,而不是一定经过k个城市,也可以经过的城市数量比k小,但要最短的路径。下,从城市 src 到城市 dst 的最低运输成本。

2024-07-09 16:12:00 221

原创 95. 城市间货物运输 II(bellman_ford之判断负权回路)

题目描述:共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市单向通行到另一个城市,不能反向通行。然而,在评估从城市 1 到城市 n 的所有可能路径中综合政府补贴后的最低运输成本时,存在一种情况:图中可能出现负权回路。负权回路是指一系列道路的总权值为负,这样的回路使得通过反复经过回路中的道路,理论上可以无限地减少总成本或无限地增加总收益。输出描述:如果没有发现负权回路,则输出一个整数,表示从城市 1 到城市 n 的最低运输成本(包括政府补贴)。

2024-07-09 15:23:52 201

原创 94. 城市间货物运输 I(Bellman_ford 队列优化算法(又名SPFA))

本图中,对所有边进行松弛,真正有效的松弛,只有松弛 边(节点1->节点2) 和 边(节点1->节点5)。而松弛 边(节点4->节点6) ,边(节点5->节点3)等等 都是无效的操作,因为 节点4 和 节点 5 都是没有被计算过的节点。Bellman_ford 算法每次松弛 都是对所有边进行松弛。但真正有效的松弛,是基于已经计算过的节点在做的松弛。由于是对边进行操作,所以使用邻接表对图进行存储较好。所以 Bellman_ford 算法。

2024-07-09 12:10:00 204

原创 94. 城市间货物运输 I(Bellman_ford 算法)

也就是说,**如果 通过 A 到 B 这条边可以获得更短的到达B节点的路径,即如果 minDist[B] > minDist[A] + value,那么我们就更新 minDist[B] = minDist[A] + value ,这个过程就叫做 “松弛”。状态二: minDist[B]本身就有权值(可能是其他边链接的节点B例如节点C,以至于 minDist[B]记录了其他边到minDist[B]的权值)题目描述:共有 n 个编号为 1 到 n 的城市,通过道路网络连接,网络中的道路仅允许从某个城市。

2024-07-08 17:14:40 271

原创 47. 参加科学大会(dijkstra(堆优化版))

当 n 很大,边的数量也很多的时候(稠密图),从点的角度来计算最小生成树。但 n 很大,边的数量很小的时候(稀疏图),可以换成从边的角度来求最短路。

2024-07-08 16:04:17 154

原创 47. 参加科学大会(dijkstra算法)

题目描述:小明的起点是第一个车站,终点是最后一个车站。然而,途中的各个车站之间的道路状况、交通拥堵程度以及可能的自然因素(如天气变化)等不同,这些因素都会影响每条路径的通行时间。接下来为 M 行,每行包括三个整数,S、E 和 V,代表了从 S 车站可以单向直达 E 车站,并且需要花费 V 单位的时间。本题就是求最短路,最短路是图论中的经典问题即:给出一个有向图,一个起点,一个终点,问起点到终点的最短路径。输出描述:输出一个整数,代表小明从起点到终点所花费的最小时间。minDist数组 用来记录。

2024-07-08 15:06:21 293

原创 117. 软件构建(拓扑排序)

题目描述:某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件依赖于其他文件的内容,这意味着如果文件 A 依赖于文件 B,则必须在处理文件 A 之前处理文件 B (0 <= A, B <= N - 1)。后续 M 行,每行两个正整数 S 和 T,表示 T 文件依赖于 S 文件。我们做拓扑排序的时候,应该优先找 入度为 0 的节点,只有入度为0,它才是出发节点。拓扑排序的过程,其实就两步:1.输出描述:输出共一行,如果能处理成功,则输出文件顺序,用空格隔开。

2024-07-08 10:14:02 107

原创 53.寻宝(最小生成树之kruskal算法)

题目描述:不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通起来(注意:这是一个无向图)。输入描述:第一行包含两个整数V 和 E,V代表顶点数,E代表边数。接下来共有 E 行,每行三个整数 v1,v2 和 val,v1 和 v2 为边的起点和终点,val代表边的权值。判断两个元素在不在同一个集合。prim 算法是维护节点的集合,而 Kruskal 是维护边的集合。–如果边首尾的两个节点不在同一个集合,加入到最小生成树,并把两个节点加入同一个集合。

2024-07-08 09:31:03 102

原创 53. 寻宝(最小生成树之prim算法)

题目描述:不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通起来(注意:这是一个无向图)。给定一张地图,其中包括了所有的岛屿,以及它们之间的距离。输入描述:第一行包含两个整数V 和 E,V代表顶点数,E代表边数。顶点编号是从1到V。接下来共有 E 行,每行三个整数 v1,v2 和 val,v1 和 v2 为边的起点和终点,val代表边的权值。最小生成树是所有节点的最小连通子图, 即:以最小的成本(边的权值)将图中所有节点链接到一起。

2024-07-07 17:48:27 97

原创 109. 冗余连接II

如下图:节点3 的入度为 2,但在删除边的时候,只能删 这条边(节点1 -> 节点3),如果删这条边(节点4 -> 节点3),那么删后本图也不是有向树了(因为找不到根节点)。本题的本质是 :有一个有向图,是由一颗有向树 + 一条有向边组成的 (所以此时这个图就不能称之为有向树),现在让我们找到那条边 把这条边删了,让这个图恢复为有向树。输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。

2024-07-07 15:41:45 384

原创 108. 冗余连接

题目描述:树可以看成是一个图(拥有 n 个节点和 n - 1 条边的连通无环无向图)。现给定一个拥有 n 个节点(节点标号是从 1 到 n)和 n 条边的连通无向图,请找出一条可以删除的边,删除后图可以变成一棵树。输入描述:第一行包含一个整数 N,表示图的节点个数和边的个数。题目说是无向图,返回一条可以删去的边,使得结果图是一个有着N个节点的树(即:只有一个根节点)。如果边的两个节点已经出现在同一个集合里,说明着边的两个节点已经连在一起了,再加入这条边一定就出现环了。输出描述:输出一条可以删除的边。

2024-07-07 14:01:18 156

原创 105. 有向图的完全可达性

输入描述:第一行包含两个正整数 N 和 M,N 代表节点的个数,M 代表边的个数。输出描述:输出一个整数,代表是否存在从节点 source 到节点 destination 的路径。**并查集主要解决集合问题,两个节点在不在一个集合,也可以将两个节点添加到一个集合中。,函数:isSame(int u, int v),就是判断两个节点是不是同一个根节点。,函数:join(int u, int v),将两个节点连在同一个根节点上。,函数:find(int u),也就是判断这个节点的祖先节点是哪个。

2024-07-07 13:17:14 192

原创 110.字符串接龙

题目描述:字典 strList 中从字符串 beginStr 和 endStr 的转换序列是一个按下述规格形成的序列: (1)序列中第一个字符串是 beginStr。(4)转换过程中的中间字符串必须是字典 strList 中的字符串,且strList里的每个字符串只使用一次。给你两个字符串 beginStr 和 endStr 和一个字典 strList,找到从 beginStr 到 endStr 的最短转换序列中的字符串数目。后续 N 行,每行一个字符串,代表 strList 中的字符串。

2024-07-05 16:54:49 293

原创 104. 建造最大岛屿

题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,你最多可以将矩阵中的一格水变为一块陆地,在执行了此操作之后,矩阵中最大的岛屿面积是多少。岛屿面积的计算方式为组成岛屿的陆地的总数。本题有一种暴力解法,遍历地图尝试 将每一个 0 改成1,然后去搜索地图中的最大的岛屿面积,但时间复杂度太高,因为重复遍历了原本存在的岛屿。第二步:再遍历地图,遍历0的方格(因为要将0变成1),并统计该1(由0变成的1)周边岛屿面积,将其相邻面积相加在一起,遍历所有 0 之后,就可以得出 选一个0变成1 之后的最大面积。

2024-07-05 15:56:13 153

原创 103. 水流问题

本题可以**从第一组边界上的节点 逆流而上,将遍历过的节点都标记上。同样从第二组边界的边上节点 逆流而上,将遍历过的节点也标记上。矩阵的左边界和上边界被认为是第一组边界,而矩阵的右边界和下边界被视为第二组边界。输出描述:输出共有多行,每行输出两个整数,用一个空格隔开,表示可达第一组边界和第二组边界的单元格的坐标,输出顺序任意。本题和沉没孤岛有点相似,沉没孤岛问题是从边界出发,标记和边界相连的岛屿,然后把未标记的岛屿沉没。我们的目标是确定那些单元格,从这些单元格出发的水可以达到第一组边界和第二组边界。

2024-07-05 14:45:33 159

原创 102.沉没孤岛

依然是从地图周边出发,将周边空格相邻的陆地都做上标记,然后在遍历一遍地图,遇到 陆地 且没做过标记的,那么都是地图中间的 陆地 ,全部改成水域就行。题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。现在你需要将所有孤岛“沉没”,即将孤岛中的所有陆地单元格(1)转变为水域单元格(0)。步骤一:深搜或者广搜将地图周边的 1 (陆地)全部改成 2 (特殊标记)步骤二:将水域中间 1 (陆地)全部改成 水域(0)

2024-07-05 11:04:02 184

原创 101.孤岛的总面积

题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。输入描述:第一行包含两个整数 N, M,表示矩阵的行数和列数。之后 N 行,每行包含 M 个数字,数字为 1 或者 0。然后我们再去遍历这个地图,遇到有陆地的地方,去采用深搜或者广搜,边统计所有陆地。输出描述:输出一个整数,表示所有孤岛的总面积,如果不存在孤岛,则输出 0。,岛屿面积的计算方式为组成岛屿的陆地的总数。

2024-07-05 10:02:52 128

原创 99. 岛屿数量

题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。输入描述:第一行包含两个整数 N, M,表示矩阵的行数和列数。后续 N 行,每行包含 M 个数字,数字为 1 或者 0。本题深度优先搜索和广度优先搜索对当前点的处理方式大致相同,主要使用模板不同,广度优先遍历需要使用队列。如果从队列拿出节点,再去标记这个节点走过,就会发生下图所示的结果,会导致很多节点重复加入队列。输出描述:输出一个整数,表示岛屿的数量。

2024-07-04 22:24:31 223

原创 98. 所有可达路径(深度优先搜索)

题目描述:给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。输出描述:输出所有的可达路径,路径中所有节点之间空格隔开,每条路径独占一行,存在多条路径,路径输出的顺序可任意。1.走当前遍历节点x的下一个节点 2 .将选中的x所指向的节点,加入到单一路径来 3.进入下一层递归 4.回溯。后续 M 行,每行包含两个整数 s 和 t,表示图中的 s 节点与 t 节点中有一条路径。当目前遍历的节点 为 最后一个节点 n 的时候 就找到了一条 从出发点到终止点的路径。, 5后面没有空格!

2024-07-04 16:41:48 296

空空如也

空空如也

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

TA关注的人

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