- 博客(25)
- 收藏
- 关注
原创 回溯--字母迷宫
字母迷宫游戏初始界面记作 m x n 二维字符串数组 grid,请判断玩家是否能在 grid 中找到目标单词 target。注意:寻找单词时 必须 按照字母顺序,通过水平或垂直方向相邻的单元格内的字母构成,同时,同一个单元格内的字母 不允许被重复使用。
2024-06-03 21:23:54 963
原创 寻找旋转排序数组中的最小值 II
已知一个长度为n的数组,预先按照升序排列,经由1到n次后,得到输入数组。例如,原数组47注意,数组的结果为数组。给你一个可能存在元素值的数组nums,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的。你必须尽可能减少整个过程的操作步骤。101n。
2024-06-01 21:15:14 592
原创 寻找旋转排序数组中的最小值
已知一个长度为n的数组,预先按照升序排列,经由1到n次后,得到输入数组。例如,原数组47注意,数组的结果为数组。给你一个元素值的数组nums,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的。你必须设计一个时间复杂度为O(log n)的算法解决此问题。1原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。0原数组为 [0,1,2,4,5,6,7] ,旋转 3 次得到输入数组。11原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。
2024-06-01 20:34:06 1065
原创 二叉搜索树--搜索二维矩阵 II
如下图所示,我们将矩阵逆时针旋转 45° ,并将其转化为图形式,发现其类似于 二叉搜索树 ,即对于每个元素,其左分支元素更小、右分支元素更大。因此,考虑从 “根节点” 开始搜索,遇到比 target 大的元素就向左,反之向右,即可找到目标值 target。编写一个高效的算法来搜索。
2024-04-12 14:13:59 796
原创 找到冠军 I
矩阵每一行 grid[i] 表示队伍 i 与其他队伍的强弱情况。=i,均有 grid[i][j]=1,而 grid[i][i]=0。因此如果队伍 i 是冠军,则有 sum(grid[i])=n−1。队伍的强弱关系具有传递性,不能成环,所以一定存在冠军。只要遍历 i,找到第一个满足 sum(grid[i])=n−1 的 i 即可。grid[0][1] == 1 表示 0 队比 1 队强。grid[1][0] == 1 表示 1 队比 0 队强。grid[1][2] == 1 表示 1 队比 2 队强。
2024-04-12 12:57:41 534
原创 查找--点名
某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席,请返回他的学号。输入: records = [0, 1, 2, 3, 4, 5, 6, 8]根据题意,数组可以按照以下规则划分为两部分。输入: records = [0,1,2,3,5]排序数组中的搜索问题,首先想到。
2024-04-11 22:02:27 425 1
原创 查找--在排序数组中查找元素的第一个和最后一个位置
两者的判断条件不同,为了代码的复用,我们定义 binarySearch(nums, target, lower) 表示在 nums 数组中二分查找 target 的位置,如果 lower 为 true,则查找第一个大于等于 target 的下标,否则查找第一个大于 target 的下标。考虑 target 开始和结束位置,其实我们要找的就是数组中「第一个等于 target 的位置」(记为 leftIdx)和「第一个大于 target 的位置减一」(记为 rightIdx)。如果数组中不存在目标值。
2024-04-11 21:27:23 526 1
原创 拓扑排序--有向无环图中一个节点的所有祖先
在遍历到节点 u 时,我们首先遍历所有通过出边相邻的子节点 v,此时根据定义 u 一定是 v 的父节点,且根据拓扑序,u 的祖先节点集合 anc[u] 已经更新完毕。如果我们按照拓扑排序的顺序来遍历每个节点并计算祖先节点集合,那么遍历到某个节点时,其所有父节点的祖先节点集合都已计算完成,我们就可以直接对这些集合加上父节点本身取并集得到该节点的所有祖先节点。有向无环图中,每个节点的所有祖先节点集合即为该节点所有父节点(即有一条直接指向该节点的有向边的节点)的本身及其祖先节点组成集合的并集。
2024-04-04 23:55:39 1197 1
原创 搜索--找出克隆二叉树中的相同节点
上图画出了树 original 和 cloned。target 节点在树 original 中,用绿色标记。答案是树 cloned 中的黄颜色的节点(其他示例类似)。的节点,并返回对该节点的引用(在 C/C++ 等有指针的语言中返回 节点指针,其他语言返回节点本身)。给你两棵二叉树,原始树。直接用深搜或者广搜即可。,以及一个位于原始树。中已有的节点的引用。
2024-04-03 20:56:15 440 1
原创 动态规划 | 分治法 -- 所有可能的真二叉树
如果构造节点数目为 n 真二叉树,此时可以从节点数目序列为 [(1,n−2),(3,n−5),⋯ ,(n−2,1)] 的真二叉树中构成,按照所有可能的组合数进行枚举,即可构造成节点数目为 n 的真二叉树。当真二叉树中有 n 个结点时,根据真二叉树的定义,此时可将其中一个叶结点增加两个子结点之后仍为真二叉树,新的真二叉树中有 n+2 个结点,由于 n 是奇数,此时 n+2 也是奇数。我们可以先构造节点数量为 1 的子树,然后构造节点数量为 5 的子树,然后依次累加即可构造出含有节点数目为 n 的真二叉树。
2024-04-02 20:16:51 1340 1
原创 双端队列--故障键盘
因为第 4 个字符是 'i' ,屏幕上的文本被反转,变成 "rts"。因为第 3 个字符是 'i' ,屏幕上的文本被反转,变成 "op"。因为第 4 个字符是 'i' ,屏幕上的文本被反转,变成 "po"。时,它会反转你所写的字符串。输入第 6 个字符后,屏幕上的文本是:"pont"。输入第 5 个字符后,屏幕上的文本是:"pon"。输入第 2 个字符后,屏幕上的文本是:"po"。输入第 1 个字符后,屏幕上的文本是:"s"。输入第 1 个字符后,屏幕上的文本是:"p"。
2024-04-01 15:36:27 862
原创 二叉树--验证二叉树的前序序列化
当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如。=0,说明没有待填充的槽位,因此是一个合法序列;此外,在遍历的过程中,若槽位数量不足(即。给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。我们可以定义一个概念,叫做槽位。一个槽位可以被看作「当前二叉树中正在等待被节点填充」的那些位置。二叉树的建立也伴随着槽位数量的变化。例如,上面的二叉树可以被序列化为字符串。此外,还需要将根节点作为特殊情况处理。
2024-03-31 16:47:18 655 1
原创 贪心--需要添加的硬币的最小数量
对于任意 1≤y<x,y 可取得,x 在数组中,因此 y+x 也可取得,区间 [x+1,2x−1](即区间 [1,x−1] 内的每个金额加上 x 之后得到的区间)内的所有金额也可取得,由此可得区间 [1,2x−1] 内的所有金额都可取得。在添加 x 之后,区间 [1,2x−1] 内的所有金额都可取得,下一个不可取得的金额一定不会小于 2x。对于正整数 x,如果区间 [1,x−1] 内的所有金额都可取得,且 x 在数组中,则区间 [1,2x−1](注意2x+1=x-1+x) 内的所有金额也都可取得。
2024-03-30 12:48:18 1099 1
原创 前后缀分解--元素和最小的山形三元组 I
这个三元组的元素和等于 nums[1] + nums[3] + nums[5] = 13。这个三元组的元素和等于 nums[2] + nums[3] + nums[4] = 9。如果一个数比左右两边最小值大时,说明找到一个山形三元组,并更新当前山形三元组的最小元素和。- nums[2] < nums[3] 且 nums[4] < nums[3]- nums[1] < nums[3] 且 nums[5] < nums[3]可以证明 nums 中不存在山形三元组。如果不存在满足条件的三元组,返回。
2024-03-29 10:14:26 689 1
原创 动态规划--访问完所有房间的第一天
以下用 to 代表 nextVisit[i],回退到房间 to 时是奇数次访问,又需要花费 f[to] 才会到达房间 to+1。分析题意发现 nextVisit[i] 的范围属于 [0,i],意味着当你首次到达房间 i 时会回退到房间 nextVisit[i]。而只有访问过该房间偶数次时才会到达下一个房间,进而推断出到达 i 时,[0,i) 的房间已经被访问过偶数次。你每天访问房间的次序是 [0,0,1,0,0,1,2,...]。你每天访问房间的次序是 [0,0,1,1,2,2,3,...]。
2024-03-28 22:53:45 836
原创 统计将重叠区间合并成组的方案数
令 r=ranges[i][1],r 是当前右端点。具体来说,j=i+1,当 j<n,并且 ranges[j][0]≤r 时,就继续合并第 j 个区间,更新 r=max(r,ranges[j][1]),然后令 j 加 1。- 区间 [1,3] ,[2,5] 和 [4,8] 在第 1 个组中,[10,20] 在第 2 个组中。- 区间 [1,3] ,[2,5] 和 [4,8] 在第 2 个组中,[10,20] 在第 1 个组中。同理,区间 [2,5] 和 [4,8] 也有交集,所以它们也必须在同一个组中。
2024-03-27 21:23:25 737
原创 56. 合并区间
如果我们按照区间的左端点排序,那么在排完序的列表中,可以合并的区间一定是连续的。首先,我们将列表中的区间按照左端点升序排序。区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,4] 和 [4,5] 可被视为重叠区间。我们用数组 merged 存储最终的答案。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。
2024-03-27 21:14:36 502
原创 最短路径算法--Dijkstra 算法
通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是"起点s到该顶点的路径"。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。
2024-03-26 22:00:34 1170
原创 设计可以求最短路径的图类--Dijkstra算法
从 3 到 2 的最短路径如第一幅图所示:3 -> 0 -> 1 -> 2 ,总代价为 3 + 2 + 1 = 6。从 0 到 3 的最短路径为 0 -> 1 -> 3 ,总代价为 2 + 4 = 6。// 添加一条节点 1 到节点 3 的边,得到第二幅图。// 返回 -1。没有从 0 到 3 的路径。
2024-03-26 21:42:05 1037
原创 零钱兑换 II
对于面额为 coin 的硬币,当 coin ≤ i ≤ amount 时,如果存在一种硬币组合的金额之和等于 i−coin,则在该硬币组合中增加一个面额为 coin 的硬币,即可得到一种金额之和等于 i 的硬币组合。因此需要遍历 coins,对于其中的每一种面额的硬币,更新数组 dp 中的每个大于或等于该面额的元素的值。因为外层循环是遍历数组 coins 的值,内层循环是遍历不同的金额之和,在计算 dp[i] 的值时,可以确保金额之和等于 i 的硬币面额的顺序,由于顺序确定,因此不会重复计算不同的排列。
2024-03-25 00:59:11 534 1
原创 零钱兑换问题
我们采用自下而上的方式进行思考。定义 F(i)为组成金额 i 所需最少的硬币数量,假设在计算 F(i) 之前,我们已经计算出 F(0)−F(i−1) 的答案。则 F(i) 对应的转移方程应为。转移过来,再算上枚举的这枚硬币数量 1 的贡献,由于要硬币数量最少,所以 F(i) 为前面能转移过来的状态的最小值加上枚举的硬币数量 1。代表的是第 j 枚硬币的面值,即我们枚举最后一枚硬币面额是。如果没有任何一种硬币组合能组成总金额,返回。,表示不同面额的硬币;你可以认为每种硬币的数量是无限的。
2024-03-24 10:44:17 425 1
原创 统计桌面上的不同数字
如果桌面上存在正整数 x>2,因为 x mod (x−1)=1,所以在执行题目的步骤后,x−1 会出现在桌面上。第二天,2 和 4 也出现在桌面上,因为 5 % 2 == 1 且 5 % 4 == 1。再过一天 3 也出现在桌面上,因为 4 % 3 == 1。在十亿天结束时,桌面上的不同数字有 2 、3 、4 、5。在十亿天结束时,桌面上的不同数字只有两个:2 和 3。因为 3 % 2 == 1 ,2 也出现在桌面上。,开始时,它放在桌面上。天之后,出现在桌面上的。最开始,5 在桌面上。
2024-03-23 10:33:22 452 1
原创 网格图中最少访问的格子数
同时对于第一个要求,我们可以在获取堆顶的 i′_opt时进行判断,如果 (i′_opt,j) 不满足一步到达 (i,j) 的要求,就可以将它从优先队列中直接移除,因为之后遍历到的同一列的位置,i 的值只会更大,也就更不可能一步走到。如果优先队列中的所有元素均被移除,说明无法走到 (i,j),否则就可以得到最少的步数,并将 i 放入优先队列。第 j 个优先队列存储的是所有位于第 j 列的位置,其中的元素是一个二元组,第一个值是到达 (i′,j)的最少步数,作为比较的关键字;无法到达右下角格子。
2024-03-22 19:31:08 695
原创 频率跟踪器
对于元素 number 的添加或删除操作,流程如下:先调整 freq[number] 在 freq_cnt 中的计数(即先减少),随后更新 freq[number](增加或减少其频率),最终在 freq_cnt 中更新新的频率计数(即增加)。// 返回 true ,因为 3 出现 1 次。在具体实现上,鉴于所有数值范围限定在 10^5 以内,数组足以作为哈希表的有效替代,既简化了代码,也提高了效率。// 数据结构现在包含 [3, 3]// 数据结构现在包含 [3]// 数据结构现在包含 [3]
2024-03-21 20:37:32 756
原创 数组元素的最小非零乘积
增加时优先增加最大的元素:缩小 a 然后选择某个元素进行增加,当选择 b 增加 1 时,此时三者乘积为 (a−1)(b+1)c,整体较 (a−1)bc 增加了 (a−1)c(a-1)c(a−1)c;将1与2^p-1做-(1-1)与+(1-1)操作,2与2^p-3做-(2-1)与+(2-1)操作,我们先思考一个简单的问题,假设给定三个正整数 a,b,c,满足 a
2024-03-20 17:34:20 437
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人