- 博客(301)
- 资源 (1)
- 收藏
- 关注
原创 LeetCode第255题_验证前序遍历序列二叉搜索树
摘要LeetCode第255题要求验证一个整数数组是否为二叉搜索树的前序遍历序列。二叉搜索树的特点是左子树节点值小于根节点,右子树节点值大于根节点。题目提供了两种主要解法:1) 递归方法,通过设定有效范围逐层验证子树;2) 单调栈法,利用栈结构模拟前序遍历过程。两种方法的时间复杂度均为O(n),但单调栈法的空间复杂度更优。代码示例展示了C#和Python的实现,包括递归验证和栈优化版本。题目难度中等,考察对二叉搜索树性质和前序遍历的理解与应用。
2025-06-08 02:00:00
898
原创 LeetCode第254题_因子的组合
LeetCode第254题要求找出给定整数n的所有因子组合,其中因子必须大于1且小于n,组合按非降序排列且不重复。可以使用回溯法解决,从最小因子2开始递归分解剩余数,通过限制因子范围和确保非降序来避免重复。例如n=12的输出是[[2,6], [2,2,3], [3,4]]。该方法时间复杂度约为O(2^(log n)),空间复杂度O(log n)。关键点在于回溯过程中保持因子递增顺序并适当剪枝优化。
2025-06-08 01:00:00
1126
原创 LeetCode第253题_会议室II
摘要LeetCode第253题"会议室II"要求计算安排给定会议列表所需的最少会议室数量。题目给定每个会议的起始和结束时间,要求避免时间冲突。两种主要解法:1)扫描线算法:分离并排序会议的开始和结束时间,通过双指针遍历比较时间点,记录同时进行的会议最大数量;2)优先队列(最小堆):按会议开始时间排序,使用最小堆跟踪最早结束会议,移除结束的会议后添加新会议,堆大小即为所需会议室数。两种方法时间复杂度均为O(n log n),空间复杂度O(n)。该问题属于经典的区间调度问题,有助于理解时间管理算法。
2025-06-07 02:00:00
1207
原创 LeetCode第252题_会议室
摘要:LeetCode第252题要求判断一个人是否能参加所有给定的会议(无时间重叠)。核心解法是先将会议按开始时间排序,然后遍历检查相邻会议是否存在重叠(当前会议开始时间小于前一个会议的结束时间)。若发现重叠则返回false,否则遍历完后返回true。该方法时间复杂度为O(n log n),空间复杂度为O(1)。文章提供了C#、Python和C++三种语言的代码实现,并对比了性能表现(C++最优)。关键点在于正确排序和相邻会议的重叠判断,常见错误包括未排序或判断条件错误。该解法简洁高效,适用于类似区间问题
2025-06-07 01:00:00
797
原创 LeetCode第251题_展平二维向量
LeetCode第251题要求设计一个迭代器来展平二维向量,支持next()和hasNext()操作。使用双索引法(行和列)追踪当前位置,在hasNext()中跳过空行,next()返回当前元素并移动指针。时间复杂度均摊O(1),空间复杂度O(1)。代码实现提供C#、Python和C++版本,核心思路是通过辅助方法处理空向量情况,确保高效遍历。
2025-06-06 02:00:00
1003
原创 LeetCode第250题_统计同值子树
摘要:LeetCode第250题要求统计二叉树中同值子树的个数(子树所有节点值相同)。采用后序遍历方法,从叶子节点开始判断,逐步向上验证。关键条件是:当前节点值必须与其子节点值相同(若存在),且左右子树都是同值子树。实现时,递归检查这些条件,满足则计数器加1。时间复杂度O(n),空间复杂度O(n)(最坏情况)。提供C#、Python和C++三种代码实现,核心思路统一:通过递归函数返回子树是否同值,并在符合条件时累加计数。
2025-06-06 01:00:00
727
原创 LeetCode第249题_移位字符串分组
摘要:LeetCode第249题要求将字符串列表中的移位字符串分组。移位字符串是指通过相同字母移位得到的字符串。解题关键是通过计算相邻字符的差值序列(模26处理循环),并使用哈希表分组。时间复杂度O(nm),空间复杂度O(nm)。代码实现了C#、Python和C++版本,亮点包括循环处理、哈希表分组和边界情况处理。类似题目包括字母异位词分组等。
2025-06-05 02:30:00
670
原创 LeetCode第248题_特殊的回文数III
LeetCode 248题要求统计给定范围内[low, high]的特殊回文数数量。特殊回文数是指旋转180度后仍然相同的数字,仅包含0、1、6、8、9这些数字。解题思路是通过递归生成所有可能的特殊回文数,然后检查它们是否在指定范围内。关键点在于:奇数长度时中间只能放0、1、8;偶数长度时数字需成对出现;且不能以0开头。代码实现展示了C#、Python和C++三种语言的解决方案,均采用递归生成所有可能数字后进行比较和计数。
2025-06-05 01:30:00
691
原创 LeetCode第247题_中心对称数II
摘要:LeetCode第247题要求生成长度为n的所有中心对称数(旋转180°后仍相同的数字)。中心对称数由数字对(0,0)、(1,1)、(8,8)、(6,9)、(9,6)构成,且不能以0开头(除非n=1)。通过递归解决:基本情况:n=0返回空字符串,n=1返回["0","1","8"];递归步骤:对n-2长度的结果,在外围添加合法数字对,最外层排除"0"开头。复杂度:时间与空间均为O(5^(n/2))。代码(C#/Python/C++)利用递归分层处理,确保数字有效性。优化方向包括迭代实现或生成
2025-06-04 03:00:00
936
原创 LeetCode第246题_中心对称数
本文介绍了LeetCode第246题"中心对称数"的解题思路和代码实现。中心对称数是指旋转180度后依然相同的数字,如69、88。解题关键在于建立数字旋转后的映射关系(0→0,1→1,6→9,8→8,9→6),然后使用双指针法从两端向中间检查每对数字是否满足映射条件。文章提供了C#、Python和C++三种语言的实现代码,并分析了算法的时间复杂度为O(n),空间复杂度为O(1)。该方法高效且简洁,适用于类似数字验证问题。
2025-06-04 02:00:00
483
原创 LeetCode第245题_最短单词距离III
LeetCode 245题是求单词列表中最短单词距离的变种,允许两个单词相同。关键在于区分两种场景:当word1和word2不同时,解法类似243题;当相同时,则需计算同一单词不同出现位置的最小间距。双指针法是高效解法,遍历时分别记录位置并动态更新最小距离。时间复杂度O(n),空间复杂度O(1)。另一种解法是先收集所有位置再比较,适用于多次查询场景。该题考查对边界条件的处理能力。
2025-06-03 21:36:41
975
原创 LeetCode第244题_最短单词距离II
摘要:LeetCode第244题要求设计一个类,计算单词数组中两个不同单词的最短距离。关键是在初始化时预处理单词位置,存储每个单词的所有出现索引。计算最短距离时,比较两单词的位置列表,寻找最小差值。可采用双指针优化,降低时间复杂度。文章提供了C#、Python和C++的实现代码,分别展示了预处理索引和双指针两种方法。该问题适用于处理需要多次查询的单词距离计算场景。
2025-06-03 21:35:50
1661
原创 LeetCode第243题_最短单词距离
LeetCode第243题要求计算给定数组中两个不同单词之间的最短距离。解题方法包括暴力法和一次遍历法。暴力法记录所有出现位置后计算最小距离,而更高效的一次遍历法在遍历时实时更新最近位置并计算距离。代码提供了C#、Python和C++三种语言的实现,其中一次遍历法通过维护两个指针来优化性能,时间复杂度为O(n),空间复杂度为O(1)。此题为简单难度,主要考察数组遍历和最小距离计算能力。
2025-06-02 02:00:00
1190
原创 LeetCode第242题_有效的字母异位词
LeetCode第242题要求判断两个字符串是否为字母异位词(字符相同但顺序不同)。摘要介绍了两种解法:1)排序比较法(O(n log n)时间复杂度);2)更高效的哈希表计数法(O(n)时间复杂度),使用26位数组统计小写字母频率。文章提供了C#、Python、C++实现代码,分析了性能差异,并给出处理Unicode字符的进阶方案。关键点包括:先检查字符串长度、准确统计字符频率、注意大小写敏感性。相关题目包括字母异位词分组等。
2025-06-02 01:00:00
934
原创 LeetCode第241题_为运算表达式设计优先级
LeetCode第241题要求为包含数字和运算符(+、-、*)的表达式设计不同优先级组合,返回所有可能的计算结果。解题思路采用分治法,通过递归将表达式按运算符分为左右两部分,分别计算所有可能值后再组合结果。代码实现展示了C#、Python和C++版本,核心都是遍历运算符,递归处理子表达式,最后组合结果。当表达式仅为数字时直接返回其整数值。该方法有效解决了不同优先级组合导致的多解问题,时间复杂度取决于运算符数量和排列组合情况。
2025-06-01 02:00:00
1088
原创 LeetCode第240题_搜索二维矩阵II
这道题要求在具有行列有序特性的二维矩阵中高效搜索目标值。最优解法是从右上角或左下角开始搜索,利用矩阵的双向有序特性,通过逐步排除行或列来缩小搜索范围,时间复杂度为O(m+n)。代码实现简洁,C++版本性能最佳。解题关键在于正确选择搜索起点,避免暴力搜索和无效遍历。相关题目包括搜索严格有序矩阵、查找矩阵中第K小元素等,都利用了类似的行列有序特性进行优化。
2025-06-01 01:00:00
917
原创 LeetCode第239题_滑动窗口最大值
LeetCode第239题要求找出滑动窗口中的最大值。题目给定数组和窗口大小k,随着窗口右移,返回每个窗口的最大值。解题方法包括优先队列(O(nlogk)时间)和更优的单调队列(O(n)时间)。单调队列通过维护递减序列,队首即为当前窗口最大值。Python和C#代码实现了这两种方法,优先队列适合小k值,而单调队列效率更高,是推荐解法。
2025-05-31 02:00:00
1285
原创 LeetCode第238题_除自身以外数组的乘积
LeetCode第238题要求计算数组中每个元素除自身外的乘积。题目要求不使用除法且在O(n)时间内完成。解题方法:左右乘积列表法:分别计算每个元素左侧和右侧的乘积,然后相乘得到结果,时间复杂度O(n),空间复杂度O(n)。空间优化法:在输出数组中先存储左侧乘积,再用变量记录右侧乘积并直接更新结果,时间复杂度O(n),空间复杂度O(1)(不包括输出数组)。关键点:避免使用除法两次遍历数组(左→右和右→左)空间优化方法仅需一个额外变量两种方法在时间复杂度上相同,但优化后的方法显著降低了
2025-05-31 01:00:00
576
原创 LeetCode第237题_删除链表中的节点
摘要:LeetCode第237题要求删除单链表中的指定节点,但无法访问头节点。解题关键在于巧妙修改当前节点:将下一个节点的值复制到当前节点,然后跳过下一个节点,实现"删除"效果。这种方法时间复杂度O(1),适用于C#、Python、C++等语言。题目保证节点非末尾且值唯一,无需额外检查。相关题目包括移除链表元素、删除重复项等。该解法突破常规思维,通过值复制和指针操作高效解决问题。(150字)
2025-05-30 02:00:00
1621
原创 LeetCode第236题_二叉树的最近公共祖先
本文介绍了LeetCode第236题"二叉树的最近公共祖先"的解题方法。题目要求在一棵普通二叉树中找到两个指定节点的最近公共祖先。文章提供了两种解决方案:递归法和迭代法。递归法通过深度优先搜索,根据左右子树搜索结果判断公共祖先;迭代法使用哈希表存储父节点信息,通过回溯比较寻找公共祖先。两种方法的时间复杂度均为O(n),空间复杂度为O(h)或O(n)。代码实现提供了C#、Python和C++三种语言的版本,适用于不同技术背景的开发者。
2025-05-30 01:00:00
1013
原创 LeetCode第235题_二叉搜索树的最近公共祖先
摘要:LeetCode第235题要求找出二叉搜索树中两个节点的最近公共祖先。利用二叉搜索树的特性(左子树值小于根,右子树值大于根),可通过迭代或递归方法高效解决。迭代法从根节点出发,根据节点值比较决定向左或向右移动,时间复杂度O(h);递归法同理,但空间复杂度O(h)。本文提供了C#、Python和C++的迭代与递归实现代码,适用于平衡树时性能更优。
2025-05-29 02:00:00
618
原创 LeetCode第234题_回文链表
本文介绍了判断链表是否为回文链表的三种方法。第一种使用栈存储节点值后比较,时间复杂度O(n),空间复杂度O(n)。第二种采用快慢指针找中点并反转后半链表比较,时间复杂度O(n),空间复杂度O(1)。第三种通过递归实现,时间复杂度O(n),但空间复杂度仍为O(n)。文章提供了C#、Python和C++的代码实现,其中快慢指针法是空间最优解,适合解决进阶要求。判断回文链表的核心在于对称性比较,不同方法在时间/空间复杂度上各有取舍。
2025-05-29 01:00:00
816
原创 LeetCode第233题_数字1的个数
本文探讨了LeetCode第233题"数字1的个数"的解法。该题要求统计所有小于等于n的非负整数中数字1出现的总次数。文章分析了暴力解法的时间复杂度问题,提出使用数学方法进行优化的思路。通过数位统计法,将问题分解为计算数字1在每个位(个位、十位等)上出现的次数,并给出了统一的计算公式。提供了C#、Python和C++的多种实现代码,比较了不同语言的性能表现。时间复杂度优化至O(log n),空间复杂度为O(1)。文章还讨论了代码优化方向、常见错误和相关题目,为解决类似数字统计问题提供了系统性的思路。
2025-05-28 02:00:00
1473
原创 LeetCode第232题_用栈实现队列
本文介绍了如何使用两个栈实现队列功能,支持push、pop、peek和empty操作。核心思路是利用输入栈(inStack)处理入队,输出栈(outStack)处理出队,当outStack为空时将inStack元素全部转入outStack以实现队列的先进先出特性。提供了C#、Python和C++三种实现代码,并分析了其时间复杂度(均摊O(1))和空间复杂度(O(n))。文章还比较了不同语言的性能差异,指出C++最快,Python最慢但更简洁,同时给出了优化建议和常见错误提醒。这种双栈方法简单直观地模拟了队列
2025-05-28 01:00:00
910
原创 LeetCode第231题_2的幂
LeetCode第231题要求判断一个整数是否是2的幂。2的幂在二进制表示中只有一个1,其余位为0。常见的解题方法包括循环迭代和位运算。循环迭代通过不断将n除以2,检查是否能整除,直到n变为1。位运算则利用n & (n-1) == 0或n & (-n) == n的特性,直接判断n是否只有一个1。代码实现中,需注意处理n为负数或零的情况。位运算方法的时间复杂度为O(1),是最优解。相关题目包括判断3的幂、4的幂等。
2025-05-27 02:00:00
566
原创 LeetCode第230题_二叉搜索树中第K小的元素
LeetCode第230题要求在一个二叉搜索树(BST)中找到第k小的元素。BST的性质使得中序遍历(左-根-右)能够得到一个升序序列,因此可以通过中序遍历来找到第k小的元素。题目提供了三种解法:递归中序遍历、迭代中序遍历和分治法。递归和迭代方法的时间复杂度为O(n),空间复杂度为O(h),其中n是节点数,h是树的高度。分治法的时间复杂度为O(h),空间复杂度为O(h)。代码实现包括C#和Python版本,分别展示了这三种方法的实现细节。
2025-05-27 01:00:00
598
原创 LeetCode第229题_求众数II
LeetCode 第229题要求找出数组中所有出现次数超过 ⌊ n/3 ⌋ 的元素。常规解法是使用哈希表计数,但题目进阶要求时间复杂度为 O(n)、空间复杂度为 O(1)。为此,可以采用摩尔投票法的扩展版本。该算法的核心思想是:数组中最多只有两个元素可能满足条件。通过维护两个候选值及其计数器,遍历数组进行投票,最终确认候选值的实际出现次数是否超过阈值。代码实现包括 C#、Python 和 C++,均通过两次遍历完成,时间复杂度为 O(n),空间复杂度为 O(1)。
2025-05-26 02:00:00
885
原创 LeetCode第228题_汇总区间
LeetCode 第228题要求将无重复元素的有序整数数组划分为连续的区间,并返回这些区间的最小有序列表。每个区间按特定格式输出,如 "a->b" 或 "a"。解题思路是通过一次遍历数组,使用两个指针记录每个区间的起点和终点,当遇到不连续的元素时,将当前区间添加到结果列表中,并开始新的区间。代码实现包括C#、Python和C++版本,时间复杂度为O(n),空间复杂度为O(1)。该题的关键在于正确处理区间的边界情况,确保每个数字都被恰好覆盖。
2025-05-26 01:00:00
679
原创 LeetCode第227题_基本计算器II
LeetCode第227题要求实现一个基本计算器,支持加减乘除运算,且整数除法仅保留整数部分。题目给出的字符串表达式包含整数、运算符和空格,且表达式有效。解题思路是使用栈来处理运算符的优先级,具体步骤如下:遍历字符串,提取数字并处理多位数。遇到运算符或字符串末尾时,根据上一个运算符的类型进行相应处理:+:将当前数字入栈。-:将当前数字的相反数入栈。*:将栈顶元素出栈,乘以当前数字,再将结果入栈。/:将栈顶元素出栈,除以当前数字,再将结果入栈。重置当前数字为0,记录当前的运算符。遍历完
2025-05-25 02:00:00
590
原创 LeetCode第226题_翻转二叉树
LeetCode第226题要求翻转一棵二叉树,即将每个节点的左右子树交换位置。题目提供了递归和迭代两种解法。递归方法通过先翻转左右子树,再交换当前节点的左右子树来实现,时间复杂度为O(n),空间复杂度为O(h),其中h为树的高度。迭代方法使用队列进行层序遍历,依次交换每个节点的左右子树,时间复杂度同样为O(n),空间复杂度为O(n)。代码实现提供了C#、Python和C++三种语言的版本,分别展示了递归和迭代的具体实现。
2025-05-25 01:00:00
1041
原创 LeetCode第225题_用队列实现栈
LeetCode 第225题要求使用队列实现栈的功能。栈是后进先出(LIFO)的数据结构,而队列是先进先出(FIFO)的。题目要求支持栈的四种操作:push、pop、top 和 empty。可以通过两种方法实现:使用两个队列:push 操作将元素添加到 q1,pop 操作将 q1 中除最后一个元素外的所有元素移到 q2,返回最后一个元素后交换 q1 和 q2。top 操作类似,但保留最后一个元素。empty 操作检查 q1 是否为空。使用一个队列:push 操作将元素添加到队列后,将之前的所有元
2025-05-24 02:00:00
1550
原创 LeetCode第224题_基本计算器
LeetCode 第224题要求实现一个基本计算器,支持加减运算和括号表达式。解题思路包括使用栈和递归或栈与符号的方法。通过维护当前结果、操作数和符号,遍历字符串处理数字、加减号和括号。遇到左括号时,将当前结果和符号压入栈中;遇到右括号时,弹出栈中的符号和结果进行计算。最终,将最后一个数字加入结果。代码实现展示了C#、Python和C++的解决方案,时间复杂度为O(n),空间复杂度为O(n)。
2025-05-24 01:00:00
977
原创 LeetCode第223题_矩形面积
LeetCode第223题要求计算两个矩形覆盖的总面积。每个矩形由其左下和右上顶点坐标表示。解题思路是先计算两个矩形的面积,再判断它们是否重叠。如果重叠,计算重叠部分的面积,最后用两个矩形的总面积减去重叠面积。判断重叠的条件是矩形不位于彼此的左侧、右侧、上方或下方。重叠区域的左下和右上顶点坐标分别由两个矩形的坐标取最大值和最小值得到。代码实现中,使用Math.Max和Math.Min函数简化了重叠区域的计算,并通过取最大值0来避免负数重叠面积。各语言实现的性能对比显示,C++实现性能最优,Python实现简
2025-05-23 02:00:00
1312
原创 LeetCode第222题_完全二叉树的节点个数
LeetCode 第222题要求计算完全二叉树的节点个数。完全二叉树的特性是除了最底层,其他层节点数达到最大值,且最底层节点集中在左侧。题目提供了三种解法:递归遍历:适用于任何二叉树,时间复杂度为O(n),空间复杂度为O(log n)。二分查找 + 位运算:利用完全二叉树的特性,通过比较左右子树高度,递归计算节点数,时间复杂度为O(log² n),空间复杂度为O(log n)。二分搜索最后一层:通过二分搜索确定最后一层节点数,时间复杂度为O(log² n),空间复杂度为O(1)。代码实现包括C#和
2025-05-23 01:00:00
840
原创 LeetCode第221题_最大正方形
LeetCode 第221题要求在一个由 '0' 和 '1' 组成的二维矩阵中,找到只包含 '1' 的最大正方形,并返回其面积。该问题可以通过动态规划高效解决。定义 dp[i][j] 表示以 matrix[i][j] 为右下角的正方形的最大边长。状态转移方程为:如果 matrix[i][j] = '1',则 dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1;否则 dp[i][j] = 0。通过遍历矩阵,更新 dp 数组,最终找到最大正方形的边长
2025-05-22 02:00:00
1346
原创 LeetCode第220题_存在重复元素III
LeetCode第220题要求判断数组中是否存在两个不同下标的元素,其值的差的绝对值不超过t,且下标的差的绝对值不超过k。题目难度为中等,提供了两种主要解题思路:滑动窗口 + 有序集合:通过维护一个大小不超过k的窗口,使用有序集合(如C#中的SortedSet或Python中的SortedList)来高效查找符合条件的元素。时间复杂度为O(n log(min(n, k))),空间复杂度为O(min(n, k))。桶排序:将元素分配到大小为t+1的桶中,检查当前桶及相邻桶中是否存在满足条件的元素。
2025-05-22 01:00:00
1092
原创 LeetCode第219题_存在重复元素II
LeetCode 第219题要求判断数组中是否存在两个相同元素,且它们的索引差不超过k。题目难度为简单,提供了两种主要解题方法:滑动窗口结合哈希集合,以及哈希表记录索引。滑动窗口方法通过维护一个大小为k的窗口,利用哈希集合快速检查重复元素,时间复杂度为O(n),空间复杂度为O(min(n, k))。哈希表记录索引方法则通过记录每个元素的最新索引,检查索引差是否满足条件,时间复杂度为O(n),空间复杂度为O(n)。代码实现提供了C#、Python和C++版本,并进行了性能分析。滑动窗口方法在数组长度远大于k时
2025-05-21 02:15:00
1090
原创 LeetCode第218题_天际线问题
天际线问题要求根据建筑物的位置和高度,生成城市的天际线轮廓。每个建筑物由三元组 [left, right, height] 表示,天际线由关键点 [x, y] 组成,并按 x 坐标排序。主要解题思路有两种:扫描线算法 + 优先队列 和 分治算法。扫描线算法通过提取建筑物的边缘点,使用优先队列维护当前最大高度,并在高度变化时记录关键点。分治算法则通过递归将建筑物分为左右两部分,分别求解天际线后合并。两种方法的时间复杂度均为 O(n log n),适用于大规模数据。代码实现中,C# 使用 SortedSet 模
2025-05-21 01:00:00
1539
原创 LeetCode第217题_存在重复元素
LeetCode 第217题要求判断一个整数数组中是否存在重复元素。题目提供了三种常见的解决方法:哈希表、排序和计数排序。哈希表方法通过遍历数组并使用集合记录已出现的元素,时间复杂度为O(n),空间复杂度为O(n)。排序方法先对数组排序,然后检查相邻元素是否相同,时间复杂度为O(n log n),空间复杂度为O(1)或O(n)。计数排序适用于元素范围较小的情况,但空间复杂度可能较高。代码实现展示了C#、Python和C++的解决方案,并对比了各语言的性能。哈希表方法在实际应用中效率较高,而Python的集合
2025-05-20 02:30:00
1638
原创 LeetCode第216题_组合总和III
LeetCode第216题“组合总和 III”要求找出所有相加之和为 n 的 k 个数的组合,且每个数字范围为1到9,且每个数字只能使用一次。题目难度为中等,解题思路主要采用回溯法和位运算。回溯法通过递归尝试每个可能的数字组合,并在满足条件时将其加入结果集;位运算则通过枚举所有可能的组合状态,筛选出符合要求的组合。代码提供了C#、Python和C++的实现,展示了如何通过回溯法和位运算解决该问题。
2025-05-20 01:45:00
2421
虚函数c++语言
2018-05-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人