算法
文章平均质量分 91
算法题
阈雪
一个一言难尽的测试开发工程师 (微信:fengruxue)
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode 二叉树题目详解(第1500-最后)
题目描述:判断二叉树是否满足奇偶树的条件:偶数层所有节点值为奇数且严格递增,奇数层所有节点值为偶数且严格递减。题目链接:https://leetcode.cn/problems/even-odd-tree/ 难度等级:中等解题思路: 使用广度优先搜索(BFS)进行层次遍历。对于每一层,检查节点值是否满足条件:偶数层节点值必须为奇数且严格递增,奇数层节点值必须为偶数且严格递减。时间复杂度:O(n) - 遍历所有节点 空间复杂度:O(w) - 队列宽度,最坏情况下为O(n)原创 2025-10-22 18:31:10 · 1149 阅读 · 0 评论 -
二叉树(第300-1500道题)
题目描述:计算给定二叉树的所有左叶子之和。左叶子节点是指是左子节点且是叶子节点的节点。题目链接:https://leetcode.cn/problems/sum-of-left-leaves/ 难度等级:简单解题思路: 使用深度优先搜索(DFS)遍历二叉树。对于每个节点,检查其左子节点是否为叶子节点(即左子节点不为空,且左子节点的左右子节点均为空)。如果是,则将左子节点的值累加到总和中。然后递归处理左子树和右子树。时间复杂度:O(n),其中n是节点数。每个节点被访问一次。原创 2025-10-22 18:04:43 · 832 阅读 · 0 评论 -
LeetCode 301-310 题目详解
计算矩形面积:(maxRow - minRow + 1) × (maxCol - minCol + 1)给定一个二值图像,其中'1'表示黑色像素,'0'表示白色像素。累加数是一个字符串,组成它的数字可以形成累加序列(每个数字是前两个数字之和)。设计一个类,能够高效计算数组中索引left到right之间元素的和。删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。给定一个空的水域,逐个位置添加陆地,每次添加后返回当前岛屿数量。:O(k×α(m×n)) - k次操作,α是反阿克曼函数。原创 2025-10-21 16:48:27 · 546 阅读 · 0 评论 -
LeetCode 291-300 题详细解析
:给定一个只包含'+'和'-'的字符串,两人轮流操作,每次可以将两个连续的'+'翻转为'--'。这里的匹配是双向的,且模式中的每个字符必须映射到字符串中的一个非空子串。:给定一个只包含'+'和'-'的字符串,每次操作可以将两个连续的'+'翻转为'--',返回所有可能的操作结果。:给定一个网格,1表示朋友的位置,0表示空地。:根据秘密数字和猜测数字,返回提示:A表示数字和位置都正确,B表示数字正确但位置错误。使用两个堆:最大堆存储较小的一半数字,最小堆存储较大的一半数字,保持两个堆的大小平衡。原创 2025-10-13 12:56:57 · 595 阅读 · 0 评论 -
LeetCode 281-290 题详细解析
:给定一个m x n的网格,每个细胞有一个初始状态:1表示活,0表示死。:给定一个仅包含数字的字符串和一个目标值,在数字之间添加二元运算符(+、-或*),返回所有能够得到目标值的表达式。:给定一个m x n的网格,其中-1表示墙,0表示门,INF表示空房间。:给定一个包含n+1个整数的数组,数字在1到n之间,假设只有一个重复数字,找出这个重复数。:给定一个数组,将所有0移动到数组的末尾,同时保持非零元素的相对顺序。:设计一个数据结构,包含一个单词字典,判断给定单词的缩写是否唯一。原创 2025-10-13 12:51:28 · 443 阅读 · 0 评论 -
LeetCode 271-280 题详细解析
使用长度前缀编码方法:对于每个字符串,先记录其长度,然后加上分隔符,最后是字符串内容。:将数组重新排列成nums[0] <= nums[1] >= nums[2] <= nums[3]...的形式。先排序,然后从后向前遍历,找到最大的h使得citations[i] >= h。如果当前栅栏与前一个颜色不同:dp[i] = dp[i-1] * (k-1)如果当前栅栏与前一个颜色相同:dp[i] = dp[i-2] * (k-1):有n个栅栏,k种颜色,要求最多连续两个栅栏颜色相同,求涂色方案数。原创 2025-10-13 12:37:51 · 773 阅读 · 0 评论 -
LeetCode 261-270 题详细解析
:有一排房子,每个房子可以用k种颜色中的一种来粉刷,每个房子粉刷成不同颜色的花费不同。:给定编号从 0 到 n-1 的 n 个节点和一个无向边列表,判断这些节点能否形成一棵有效的树。动态规划优化,记录前一个房子的最小花费和次小花费,避免每次都要遍历所有颜色。:给定一个包含[0, n]中n个数的数组,找出数组中缺失的那个数字。方法1:数学公式 - 计算0到n的和,减去数组中所有数的和。:给定一个按外星字典序排序的单词列表,推断出字母的顺序。:找出第n个丑数(只包含质因数2、3、5的正整数)。原创 2025-10-13 12:29:26 · 470 阅读 · 0 评论 -
LeetCode 251-260 题详细解析
状态转移:dp[i][j] = costs[i][j] + min(dp[i-1][k]),其中k ≠ j。:设计一个迭代器,实现一个二维向量的展开,使其能够按顺序遍历二维向量中的所有元素。遍历会议,如果当前会议开始时间大于等于堆顶结束时间,可以复用会议室。:给定一个会议时间安排的数组,判断一个人是否能够参加所有会议。动态规划:dp[i][j]表示第i个房子刷第j种颜色的最小成本。检查每个会议的开始时间是否大于等于前一个会议的结束时间。:粉刷一排房子,相邻房子不能同色,求最小成本。原创 2025-10-13 11:50:44 · 997 阅读 · 0 评论 -
LeetCode 241-250 题详细解析
:给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。:中等:使用分治法和记忆化搜索。遍历字符串,当遇到运算符时,将表达式分成左右两部分,分别递归计算左右两部分的所有可能结果,然后根据当前运算符组合结果。:O(Catalan(n)),最坏情况是指数级:O(n²),用于存储中间结果。原创 2025-10-13 11:45:35 · 572 阅读 · 0 评论 -
LeetCode 231-240 题详细解析
:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。:给你一个整数数组 nums,返回数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。:编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。:给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。2的幂次方的二进制表示只有一个1,其他位都是0。:有一个单链表的节点,请编写一个函数删除该节点。原创 2025-10-13 11:22:42 · 429 阅读 · 0 评论 -
LeetCode 221-230 题详细解析
:给你二维平面上两个由直线构成且边平行于坐标轴的矩形,请你计算并返回两个矩形覆盖的总面积。pop:将主队列中除最后一个元素外的所有元素移到辅助队列,弹出最后一个元素,然后交换队列。:给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。:O(log²n),每次递归计算高度O(logn),递归深度O(logn),请你实现一个基本计算器来计算并返回它的值。:实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。:请你仅使用两个队列实现一个后入先出(LIFO)的栈。原创 2025-10-13 10:52:00 · 532 阅读 · 0 评论 -
LeetCode 211-220 题详细解析
搜索单词:最坏情况O(26^L),但实际中由于单词长度有限且不会全是'.',效率可接受。:找出所有k个数字的组合,数字从1-9中选择,和为n,每个数字最多使用一次。:O(M×N×4×3^(L-1)),其中M、N为网格大小,L为单词最大长度。:O(N×L),其中N为单词数,L为平均单词长度,主要用于存储字典树节点。:O(K×L),其中K为单词数,L为单词最大长度,主要用于存储字典树。:平均O(n),最坏O(n²),但随机化后期望为O(n)添加单词:O(L),其中L为单词长度,需要遍历每个字符。原创 2025-10-13 10:45:24 · 522 阅读 · 0 评论 -
LeetCode 201-210 题详细解析
这道题的关键观察是:对于连续数字的按位与操作,结果实际上是 left 和 right 的公共二进制前缀。因为从 left 到 right 的连续数字中,二进制表示的每一位都会经历从 0 到 1 的变化,只有那些在 left 和 right 中保持不变的位才会在结果中为 1。:给定两个整数 left 和 right,返回区间 [left, right] 内所有数字按位与的结果。Trie 树的每个节点包含子节点数组和结束标志,支持高效的前缀查询。:返回学习所有课程的顺序,如果不可能则返回空数组。原创 2025-10-13 10:19:58 · 1322 阅读 · 0 评论 -
LeetCode 191-200 题详解
:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。:给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。:给定一个包含电话号码列表的文件,编写一个bash脚本,打印所有有效的电话号码。原创 2025-10-08 21:52:32 · 1234 阅读 · 0 评论 -
LeetCode 181-190 题详解
:简单:编写一个SQL查询,该查询可以获取收入超过他们经理的员工的姓名。:使用自连接将员工表与经理表连接比较员工的薪水与经理的薪水选择员工薪水大于经理薪水的记录。原创 2025-10-08 21:52:06 · 688 阅读 · 0 评论 -
LeetCode 171-180 题详解
:编写一个SQL查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:FirstName, LastName, City, State。状态转移方程:dp[i][j] = max(1, min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j]):编写一个SQL查询,获取Employee表中第n高的薪水。:给定一组非负整数nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。:给定一个整数 n,返回 n!原创 2025-10-08 21:48:05 · 736 阅读 · 0 评论 -
LeetCode 161-170 题详解
给你一个整数数组 nums,找到峰值元素并返回其索引。:给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。:给定一个排序的整数数组 nums,其中元素的范围在闭区间 [lower, upper] 内,返回缺失的区间列表。:给定两个字符串 s 和 t,判断它们是否只相差一个编辑操作(插入一个字符、删除一个字符或替换一个字符)。:给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。:给定一个大小为 n 的数组,找到其中的多数元素。原创 2025-10-08 21:46:53 · 991 阅读 · 0 评论 -
LeetCode 151-160 题详解
给你一个元素值互不相同的数组 nums,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。给你一个可能存在重复元素值的数组 nums,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。:给定一个二叉树,其中所有的右节点要么是具有兄弟节点(拥有相同父节点的左节点)的叶节点,要么为空。:给你一个整数数组 nums,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。:设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。原创 2025-10-08 18:13:50 · 729 阅读 · 0 评论 -
LeetCode 151-160 题详解
给你一个元素值互不相同的数组 nums,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。给你一个可能存在重复元素值的数组 nums,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。:给定一个二叉树,其中所有的右节点要么是具有兄弟节点(拥有相同父节点的左节点)的叶节点,要么为空。:给你一个整数数组 nums,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。:设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。原创 2025-10-08 18:10:44 · 1064 阅读 · 0 评论 -
LeetCode 141-150 题详解
:给定一个单链表 L 的头节点 head,单链表 L 表示为:L0 → L1 → …→ Ln-1 → Ln。:给定一个链表的头节点 head,返回链表开始入环的第一个节点。请将其重新排列为:L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …:给你链表的头结点 head,请将其按升序排列并返回排序后的链表。:给你二叉树的根节点 root,返回它节点值的前序遍历。:给你二叉树的根节点 root,返回它节点值的后序遍历。:给你一个链表的头节点 head,判断链表中是否有环。原创 2025-10-08 17:45:48 · 1016 阅读 · 0 评论 -
LeetCode 131-140 题详解
给定两个整数数组 gas 和 cost,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。:给定一个字符串 s 和一个字符串字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。:给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。:给你无向连通图中一个节点的引用,请你返回该图的深拷贝(克隆)。原创 2025-10-08 17:40:32 · 1433 阅读 · 0 评论 -
LeetCode 121-130 题详解
:按字典 wordList 完成从单词 beginWord 到单词 endWord 的转化,一个表示转换过程的序列是形式上像 beginWord -> s1 -> s2 -> ... -> endWord 这样的单词序列,并满足:每对相邻的单词之间仅有单个字母不同;:给你一个 m x n 的矩阵 board,由若干字符 'X' 和 'O' 组成,捕获所有被围绕的区域。:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。从边界上的'O'开始DFS/BFS,标记所有相连的'O'原创 2025-10-08 17:27:24 · 1176 阅读 · 0 评论 -
LeetCode 111-120 题详解
:给定一个二叉树,填充它的每个 next 指针,让这个指针指向其下一个右侧节点。:给你二叉树的根节点 root 和一个整数目标和 targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。状态转移方程:dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j]如果s[i-1] == t[j-1],则dp[i][j] = dp[i-1][j-1] + dp[i-1][j]dp[i][j]表示从位置(i,j)到底部的最小路径和。原创 2025-10-08 17:12:16 · 697 阅读 · 0 评论 -
LeetCode 101-110 题详解
:给定两个整数数组 inorder 和 postorder,其中 inorder 是二叉树的中序遍历,postorder 是同一棵树的后序遍历,请你构造并返回这颗二叉树。:给定两个整数数组 preorder 和 inorder,其中 preorder 是二叉树的先序遍历,inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。:给定一个单链表的头节点 head,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。比较左子树的左节点与右子树的右节点,左子树的右节点与右子树的左节点。原创 2025-10-08 17:09:52 · 871 阅读 · 0 评论 -
LeetCode 91-100题详细解析(Java实现)
:一条包含字母 A-Z 的消息通过以下映射进行了编码:'A' -> "1", 'B' -> "2", ..., 'Z' -> "26"。例如,"11106" 可以映射为:"AAJF" (1,1,10,6),"KJF" (11,10,6)。注意,消息不能分组为 (1,11,06),因为 "06" 不能映射为 "F",这是由于 "6" 和 "06" 在映射中并不等价。使用递归方法,对于每个数字作为根节点,递归生成左右子树的所有可能组合,然后组合成完整的二叉搜索树。或者使用递归,传递当前节点的值范围。原创 2025-10-03 20:40:31 · 891 阅读 · 0 评论 -
LeetCode 81-90题详细解析(Java实现)
:给你一个链表的头节点 head 和一个特定值 x,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于或等于 x 的节点之前,并且保留两个分区中每个节点的初始相对位置。:给定一个已排序的链表的头 head,删除所有重复数字的节点,只留下原始链表中没有重复出现的数字。交换的情况:s1的前k个字符与s2的后k个字符是扰乱字符串,且s1的剩余字符与s2的前n-k个字符是扰乱字符串。不交换的情况:s1的前k个字符与s2的前k个字符是扰乱字符串,且s1的剩余字符与s2的剩余字符是扰乱字符串。原创 2025-10-03 20:34:50 · 832 阅读 · 0 评论 -
LeetCode 71-80题详细解析(Java实现)
:给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。使用栈来处理路径中的目录名。遍历网格中的每个单元格,从当前单元格开始,向四个方向搜索匹配的字符,使用visited数组记录已访问的单元格。否则,dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1。:给你一个有序数组 nums,请你原地删除重复出现的元素,使每个元素最多出现两次,返回删除后数组的新长度。原创 2025-10-03 20:29:35 · 1003 阅读 · 0 评论 -
LeetCode 60-70题详细解析(Java实现)
状态转移方程:dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]。创建一个二维数组dp,其中dp[i][j]表示从起点到(i, j)的路径数。状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]。:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。dp[i] = dp[i-1] + dp[i-2],即到达第i阶楼梯的方法数等于到达第i-1阶和第i-2阶的方法数之和。原创 2025-10-03 18:26:20 · 1135 阅读 · 0 评论 -
LeetCode 50-60题详细解析(Java实现)
中文链接难度:简单题目描述:给你一个字符串 s,由若干单词组成,单词之间用空格隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回 0。解题思路:从字符串末尾开始向前遍历,先跳过末尾的空格,然后计算最后一个单词的长度。时间复杂度:O(n) - 最坏情况下需要遍历整个字符串空间复杂度:O(1) - 只使用常数空间// 跳过末尾空格i--;// 计算最后一个单词长度= ' ') {length++;i--;原创 2025-10-03 18:23:33 · 1061 阅读 · 0 评论 -
LeetCode 41-50题详细解析(Java实现)
:这道题的关键是理解最小的正整数一定在[1, n+1]范围内,n是数组长度。关键点是理解乘法过程中每个数字的位置关系:num1[i] * num2[j] 的结果应该放在数组的 [i+j, i+j+1] 这两个位置。遍历数组时,我们更新能到达的最远位置,当到达当前边界时,增加跳跃次数并更新边界为当前能到达的最远位置。这是经典的回溯算法应用。:给你一个未排序的整数数组,找出其中没有出现的最小的正整数。:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。原创 2025-10-03 18:22:26 · 1002 阅读 · 0 评论 -
LeetCode 21-40题详细解析(Java实现)
题目描述:给定一个有序数组,找出目标值的开始位置和结束位置解题思路:使用两次二分查找,分别查找第一个位置和最后一个位置时间复杂度:O(log n)空间复杂度:O(1)// 查找第一个位置// 查找最后一个位置} else {return idx;原创 2025-10-03 18:05:25 · 877 阅读 · 0 评论 -
LeetCode 1-20题详细解析(Java实现)
:O(3^m * 4^n) - m是3字母数字个数,n是4字母数字个数。:O(n²) - 排序O(n log n),双指针O(n²):O(n²) - 排序O(n log n),双指针O(n²):O(log(min(m,n))) - 每次搜索范围减半。:O(min(n, m)) - m为字符集大小。:O(max(m,n)) - 遍历较长的链表。:O(max(m,n)) - 结果链表长度。:O(log(x)) - 与数字位数成正比。:O(log(n)) - 与数字位数成正比。原创 2025-10-03 18:00:17 · 1132 阅读 · 0 评论 -
算法系列:链表
int val;哑节点(Dummy Node)技巧:简化头节点可能变化的操作避免处理空链表的特殊情况快慢指针技巧:检测链表环:快指针每次两步,慢指针每次一步找到链表中点:快指针到尾部时,慢指针在中点删除倒数第N个节点:快指针先走N步链表反转模板:= null) {// 新头节点边界条件处理:总是检查的情况处理单节点链表的特殊情况注意指针移动时的空指针异常防护。原创 2025-09-10 15:49:26 · 600 阅读 · 0 评论 -
算法系列:二叉树
深度计算:最大深度、直径遍历算法:层序、中序属性判断:对称、BST验证路径问题:路径总和结构操作:翻转二叉树特殊节点:最近公共祖先视角问题:右视图掌握这些题目及其变种,能够应对绝大多数二叉树相关的面试问题。在面试中,不仅要写出代码,还要能够解释时间复杂度和空间复杂度,以及可能的优化方法。用户:java 中关于TreeNode 的一些实现类,方法/*** 二叉树节点定义*/// 节点值// 左子节点// 右子节点// 构造方法@Override。原创 2025-09-10 15:45:37 · 942 阅读 · 0 评论
分享