- 博客(50)
- 收藏
- 关注
原创 实现Trie(前缀和)C++
从根结点的子结点开始与word第一个字符进行匹配,一直匹配到前缀链上没有对应的字符,这时开始开辟新的结点,直到插入完word的最后一个字符,同时还要将最后一个结点设置为end=true,表示这是一个终止节点;boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true;boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);
2025-08-04 11:54:04
319
原创 课程表C++
在选修某些课程之前需要一些先修课程。先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi。你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1。否则,返回 false。例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1。出度:从这个顶点出发有多少条边。入度:有多少条边指向这个顶点。获得一个拓扑序,拓扑序不唯一。
2025-08-04 11:16:21
136
原创 腐烂的橘子C++
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。引入fresh变量,记录矩阵中新鲜橘子的数量,避免了扩散结束还要再遍历一次。每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。搜索的思想(不用DFS是因为DFS可能会回退,而这里不需要回退)值 2 代表腐烂的橘子。值 0 代表空单元格;值 1 代表新鲜橘子;
2025-07-31 12:06:09
127
原创 岛屿数量C++
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。遍历过一个岛屿就对该岛屿上所有陆地(“1”)做一个标志(即该值为0/1以外的值)此外,你可以假设该网格的四条边均被水包围。
2025-07-29 11:25:35
129
原创 二叉树的最大路径和C++
二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个 节点,且不一定经过根节点。给你一个二叉树的根节点 root ,返回其 最大路径和。路径和 是路径中各节点值的总和。
2025-07-29 11:17:27
182
原创 搜索二维矩阵Ⅱ C++
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。每行的元素从左到右升序排列。每列的元素从上到下升序排列。时间复杂度O(m+n)
2025-07-28 11:17:08
171
原创 路径总和Ⅲ(树)C++
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。,即在遍历结束左子树后开始遍历右子树时,哈希表中还保留着左子树的信息,这是在遍历右子树时用不到的,所以要及时恢复,否则计数会越来越大;路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。,则剩下就需要找到有多少个起点满足条件。使用深度优先遍历DFS,先找到路径。即可转换成前缀和的问题,参考。
2025-07-24 17:35:01
212
原创 和为K的子数组(前缀和)C++
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数。即先求解前缀和数组,再在前缀和数组上利用哈希表进行两数之和问题的求解,经过。扩展到这道题,即若nums[i]到nums[j]的和为k,可以用前缀和。输入:nums = [1,1,1], k = 2。输入:nums = [1,2,3], k = 3。也可以一边计算前缀和,一边遍历,即只需要。子数组是数组中元素的连续非空序列。
2025-07-24 12:05:07
914
原创 两数之和C++
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。输入:nums = [2,7,11,15], target = 9。你可以按任意顺序返回答案。
2025-07-24 11:35:24
199
原创 区域和检索 - 数组不可变(前缀和)C++
例如数组[-2, 0, 3, -5, 2, -1],要想计算子数组 [-5, 2] 的元素和,可以用前缀 [-2, 0, 3, -5, 2] 的元素和,减去另一个前缀 [-2, 0, 3] 的元素和,就得到了子数组 [-5, 2] 的元素和。对于题目,[-2, 0, 3, -5, 2, -1]的前缀和数组是[0,−2,−2,1,−4,−2,−3]相当于[0,right]的前缀和减去[0,left-1]的前缀和,即求一个前缀和数组即可,任意子数组的和,都可以表示为两个前缀和的差。(两个数组下标要对应好)
2025-07-24 11:15:32
679
原创 从前序和中序遍历中构建二叉树C++
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。先序(前序):根->左->右。中序:左->根->右。
2025-07-04 11:36:14
181
原创 二叉树展开为链表C++
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null。迭代法,创建了一个哨兵节点(先序遍历),用了栈,空间复杂度为O(n)迭代法,原地创建,没有创建新节点,并且空间复杂度为O(1)展开后的单链表应该与二叉树 先序遍历 顺序相同。
2025-07-03 20:48:30
315
原创 二叉树的右视图C++
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。,每次找每层的最后一个节点。
2025-07-03 20:26:58
164
原创 二叉搜索树中第k小的元素
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。
2025-07-02 21:05:26
127
原创 判断平衡二叉树C++
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。左子树的值全部小于当前节点的值。右子树的值全部大于当前节点的值。
2025-07-02 20:26:00
193
原创 二叉树的直径C++
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度。这条路径可能经过也可能不经过根节点 root。给你一棵二叉树的根节点,返回该树的 直径。两节点之间路径的 长度 由它们之间边数表示。直径和二叉树的最大深度不一样。
2025-07-01 11:57:26
126
原创 翻转二叉树C++
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。交换左右节点用swap函数就行了。能用递归做的,也能够用栈做。
2025-06-30 11:28:08
204
原创 二叉树的中序遍历C++
给定一个二叉树的根节点 root ,返回 它的 中序 遍历。:左根右,先遍历左子树,再回到中间节点遍历它,最后遍历右子树。的特点,将每步走过的节点存到栈中,需要时再弹出。
2025-06-27 11:14:45
134
原创 LRU缓存C++
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1。// 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}// 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}lRUCache.get(1);// 缓存是 {1=1, 2=2}// 返回 -1 (未找到)lRUCache.get(1);// 返回 -1 (未找到)lRUCache.put(1, 1);// 缓存是 {1=1}
2025-06-26 14:40:45
294
原创 排序链表C++
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表。输入:head = [4,2,1,3]输出:[1,2,3,4]对时间复杂度有要求,运用。
2025-06-25 14:41:26
373
原创 随机链表的复制C++
深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点。给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。用一个由 n 个节点组成的链表来表示输入/输出中的链表。你的代码 只 接受原链表的头节点 head 作为传入参数。
2025-06-24 11:57:57
167
原创 两两交换链表中的节点C++
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。输入:head = [1,2,3,4]输出:[2,1,4,3]
2025-06-24 10:23:28
157
原创 两数相加链表C++
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。输入:l1 = [2,4,3], l2 = [5,6,4]请你将两个数相加,并以相同形式返回一个表示和的链表。解释:342 + 465 = 807.输出:[7,0,8]
2025-06-23 14:01:52
235
原创 相交链表C++
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null。
2025-06-20 19:19:22
410
原创 矩阵置零C++
3、由于首行首列还需要记录哪一行哪一列有0,所以第1步和第2步可能会有冲突,于是加入两个bool量,标志首行首列是否有0。给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0。请使用 原地 算法。2、于是可以直接遍历非首行首列的元素,若该元素对应的首行首列为0,说明该元素最后还是需要置0。1、让首行首列记录哪一行哪一列有0。
2025-06-19 11:37:53
186
原创 除自身以外数组的乘积C++
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。输入: nums = [-1,1,0,-3,3],且在 O(n) 时间复杂度内完成此题。输入: nums = [1,2,3,4]输出: [24,12,8,6]输出: [0,0,9,0,0]脑子里第一个想到的就是除法…
2025-06-18 12:01:08
194
原创 轮转数组C++
输入: nums = [1,2,3,4,5,6,7], k = 3。输入:nums = [-1,-100,3,99], k = 2。向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7,1,2,3,4]向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]输出: [5,6,7,1,2,3,4]输出:[3,99,-1,-100]
2025-06-18 11:51:03
261
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人