- 博客(123)
- 收藏
- 关注
原创 美团9-6:编程题
本文包含两道编程题目及解答。第一题要求统计字符串中不同"x-dp"算法的种类数,通过遍历字符串并利用哈希集合判重来解决。第二题要求重排数组以最大化各位置MEX值的和,通过对数组排序后逐个计算MEX值来实现。两题均给出了详细思路和C++代码实现。
2025-09-06 19:52:45
381
原创 力扣152:乘积最大子数组
本文介绍了力扣152题"乘积最大子数组"的解法。该题要求找出数组中乘积最大的非空连续子数组。文章首先分析了一种基于动态规划的初步思路,指出其在处理负数时会失效的问题。随后提出更优的双向遍历解法:通过同时计算从头到尾和从尾到头的乘积,分别处理全正数、奇数个负数和偶数个负数三种情况,并特别处理0值的情况。最终代码实现中,维护两个乘积变量pre和bck,在遍历过程中比较当前值、pre和bck,同时遇到0时重置乘积,从而保证能够正确找到最大乘积。这种方法有效解决了负数乘积反转的问题,时间复杂度为
2025-09-05 23:16:08
731
原创 力扣416:分割等和子集
题目要求判断一个正整数数组是否能分割成两个和相等的子集。关键思路是:首先检查数组和是否为偶数,否则直接返回false;然后转化为在数组中寻找和为总和一半的子序列问题。使用动态规划,定义dp[i][j]表示前i个数能否组成和为j的子集。通过状态转移方程,考虑每个数字选或不选的情况,最终判断能否达到目标和。该方法先进行剪枝优化,再通过二维DP数组高效求解。
2025-09-05 22:47:08
1175
原创 力扣55:跳跃游戏
题目要求判断能否从数组第一个下标跳到最后一个下标。解题思路是维护一个变量load表示当前能到达的最远位置,遍历数组时若当前位置超出load则返回false,否则更新load为当前位置加可跳跃距离和原load的较大值。若能完整遍历数组则返回true。时间复杂度O(n),空间复杂度O(1)。
2025-09-05 21:45:23
389
1
原创 力扣93:复原IP地址
本文介绍了力扣93题"复原IP地址"的解法。题目要求从给定数字字符串中生成所有可能的有效IP地址(由4个0-255整数组成,无前导0)。解题采用回溯算法,通过三个关键步骤:1)结束条件判断是否已生成4个合法数字并遍历完字符串;2)剪枝处理无效情况(如数字未生成完但已到字符串末尾或前导0);3)回溯主体从当前位置开始尝试生成合法数字(0-255)。代码使用深度优先搜索实现,维护一个数组存储当前IP地址段,递归生成所有可能组合后拼接为有效IP地址。
2025-09-05 00:20:08
412
原创 力扣39:组合总和
摘要:本文介绍了力扣39题"组合总和"的解法。题目要求在无重复元素的整数数组中找到所有和为target的组合,同一数字可重复使用。采用回溯算法,通过target作为结束条件(当减至0时记录结果),并利用target值剪枝(跳过使target为负的元素)。回溯主体使用循环遍历候选数,从当前索引开始以避免重复组合。代码实现简洁,通过递归和临时数组存储当前组合,最终返回所有符合条件的解。算法时间复杂度取决于解的个数,最坏情况下为O(n^target)。
2025-09-04 23:38:14
291
原创 力扣14:最长公共前缀
本文介绍了力扣第14题"最长公共前缀"的解法。题目要求找出字符串数组中的最长公共前缀,若无则返回空串。算法思路是:先将第一个字符串作为初始公共前缀res,然后依次与其他字符串比较。在比较过程中,使用两个指针同时遍历res和当前字符串,记录相同字符部分作为临时前缀,结束后更新res。该方法通过逐步缩小公共前缀范围,最终得到结果。时间复杂度为O(S),其中S是所有字符串字符总数。
2025-09-04 23:27:13
246
原创 力扣654:最大二叉树
本文介绍了力扣654题"最大二叉树"的解法。题目要求根据给定的不重复整数数组构建最大二叉树,构建规则是:以数组最大值作为根节点,最大值左侧子数组构建左子树,右侧构建右子树。代码使用递归方法实现,首先找到当前子数组的最大值位置,然后分别递归处理左右子数组。时间复杂度为O(n^2),空间复杂度为O(n)。该方法直观实现了题目描述的构建过程,通过递归分治完成二叉树构造。
2025-09-04 23:18:18
196
原创 力扣190:颠倒二进制位
本文介绍了力扣190题"颠倒二进制位"的解法。题目要求颠倒32位无符号整数的二进制位。解题思路是通过逐位处理,将原数的最低位变为结果数的最高位,依次类推。代码实现中,使用位运算操作:通过n&1获取最低位,左移(31-i)位定位到结果数的对应位置,用按位或运算累积结果,最后右移原数处理下一位。该方法高效地完成了二进制位的颠倒操作。
2025-09-04 23:16:35
249
原创 力扣115:不同的子序列
本文介绍了一种使用动态规划解决力扣115题"不同的子序列"的方法。题目要求统计字符串s的子序列中出现字符串t的次数。通过构建二维数组dp[i][j]表示s前i个字符中t前j个字符作为子序列的个数,初始化时dp[i][0]=1(空串是任何串的子序列)。当s[i-1]==t[j-1]时,dp[i][j]等于匹配该字符(dp[i-1][j-1])和不匹配(dp[i-1][j])两种情况之和;当字符不相等时,直接继承前一个状态dp[i-1][j]。最终返回dp[n][m]即为所求结果,时间复杂度
2025-09-03 23:22:04
346
原创 力扣72:编辑距离
本文介绍了力扣72题"编辑距离"的动态规划解法。该题要求计算将word1转换为word2所需的最少操作次数,操作包括插入、删除或替换字符。通过分析三种操作之间的等价关系,将问题转化为取三种子问题的最小值:对A插入字符、对B插入字符或替换字符。使用二维数组dp[i][j]表示word1前i个字符到word2前j个字符的编辑距离,通过状态转移方程dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1])求解,最终返回dp[n][m]作为结
2025-09-02 18:47:58
1032
原创 力扣242:有效的字母异位词
本文介绍了力扣242题"有效的字母异位词"的解法。题目要求判断两个字符串是否为字母异位词(包含相同字母但顺序不同)。解题思路有两种:一是对字符串排序后比较;二是使用哈希表统计字符出现次数。代码展示后一种方法,先比较长度,然后用哈希表记录第一个字符串的字符频次,再遍历第二个字符串递减对应字符频次,若出现负值则返回false。该方法时间复杂度为O(n),空间复杂度为O(1)。
2025-09-02 18:01:38
235
原创 美团8-30:编程题
本文包含两道编程题解:1. 数字变换问题:通过模拟数字n的k次变换过程,发现当n变为1后会进入1-2-4的循环,优化了时间复杂度;2. 有限小数判定问题:通过数学方法判断分数在k进制下是否为有限小数,关键在于最简分母的质因子必须包含在k的质因子中。两题均给出了详细思路和C++实现代码,分别利用循环规律和辗转相除法等技巧解决问题。
2025-08-30 21:48:03
781
原创 力扣1114:按序打印
本文介绍了力扣1114题"按序打印"的解法。题目要求三个线程按顺序执行first、second、third方法。文章提出使用互斥锁的解决方案,通过定义两把锁mut1和mut2,并使用unique_lock和lock_guard确保线程安全。在first执行后解锁mut1,second获取mut1锁后执行并解锁mut2,third获取mut2锁后执行。这种方法避免了直接使用mutex可能导致的线程安全问题,保证了三个方法的执行顺序。代码实现简洁明了,利用RAII机制管理锁的生命周期,确保线
2025-08-29 00:00:40
386
原创 力扣18:四数之和
本文介绍了力扣18题"四数之和"的解题思路。题目要求找出数组中所有和为target且不重复的四元组。采用回溯算法,通过三个关键剪枝优化:1)剩余数字不足时提前终止;2)当前和加最小值仍大于target时终止;3)当前和加最大值仍小于target时跳过。同时使用排序和去重处理确保结果唯一。代码实现中,先对数组排序,再通过深度优先搜索回溯所有可能组合,利用剪枝条件大幅降低时间复杂度,最终返回所有符合条件的四元组。
2025-08-28 23:45:05
1042
原创 redbook的判断完美数
摘要:本文介绍了如何判断一个数是否为完美数,即是否存在长度≥3、公差为1的等差数列乘积等于该数。核心思路是排除小于6的数,然后通过三重循环枚举可能的等差数列长度、起始值和乘积,并进行优化处理。当阶乘超过目标数时提前终止计算,同时对乘积进行防溢出处理。最终通过比较乘积与目标数来确定是否为完美数。代码实现了这一逻辑,并提供了主函数进行测试验证。
2025-08-27 23:54:15
300
原创 牛客JZ14:剪绳子
摘要:本文介绍了牛客网JZ14题"剪绳子"的解法。题目要求将长度为n的绳子剪成m段,求各段长度乘积的最大值。核心思路是动态规划:定义dp数组存储各长度下的最大乘积,初始值dp[1-4]已知。对于n≥5,通过双重循环比较剪与不剪的情况,递推得出最优解。时间复杂度O(n²),空间复杂度O(n)。关键点在于发现当n≥4时,剪开比不剪更优,利用动态规划存储中间结果避免重复计算。
2025-08-26 22:57:57
146
原创 力扣52:N皇后Ⅱ
摘要: 本文介绍了力扣52题N皇后Ⅱ的解题思路与实现。该问题要求在n×n棋盘上放置n个互不攻击的皇后,返回可行解的数量。解题关键在于利用回溯算法,通过标记列和两个对角线(行列差和行列和)来避免冲突。代码使用哈希表记录被占用的列和对角线,逐行尝试每一列的合法位置,递归统计可行解总数。最终返回BackCall函数从第0行开始回溯的结果。
2025-08-25 23:25:09
218
原创 力扣82:删除排序链表中的重复元素Ⅱ
本文介绍了力扣82题的解法,要求删除排序链表中所有重复元素节点。解题思路是使用哈希表统计每个值出现的次数,然后遍历链表删除出现次数大于1的节点。代码实现中创建了一个虚拟头节点,通过两次遍历完成操作:第一次统计频率,第二次执行删除。该方法时间复杂度为O(n),空间复杂度为O(n),能有效处理已排序链表的去重问题。
2025-08-25 23:16:09
274
原创 力扣594:最和谐子序列
题目要求找出给定数组中元素差正好为1的最长子序列长度。通过排序数组后,使用滑动窗口(双指针)方法:左指针标记子序列起点,右指针扩展窗口。当差值大于1时移动左指针,等于1时更新最大长度。这种解法时间复杂度主要取决于排序步骤,为O(nlogn),空间复杂度O(1)。代码实现简洁高效,是典型的滑动窗口应用场景。
2025-08-24 23:47:30
248
原创 力扣904:水果成篮
题目要求在一排果树中选择一个子数组,其中只能包含两种水果类型,求最大子数组长度。使用滑动窗口和哈希表来维护窗口中水果种类,当超过两种时移动左边界调整窗口,确保始终满足条件。时间复杂度O(n),空间复杂度O(1)。该方法避免了动态规划的低效性,直接通过双指针和哈希表高效解决问题。
2025-08-24 23:40:05
468
原创 力扣1005:k次取反后最大化的数组和
题目要求通过对数组元素取反k次,使得数组和最大化。关键思路是优先将负数变为正数,若k仍有剩余,则根据剩余次数的奇偶性决定是否对最小数取反。具体步骤:先排序数组,将负数逐个取正直到k耗尽或没有负数;若k仍有剩余且为奇数,则对当前最小数取反一次。最终返回数组和即可。代码通过两次排序和一次遍历实现,时间复杂度为O(n log n)。
2025-08-21 22:46:40
238
原创 力扣905:按奇偶排序数组
题目要求将数组中的偶数移到前面,奇数移到后面。使用双指针法,cur指针遍历数组,prev指针标记交换位置。四种情况处理:1) 双偶指针前进;2) 偶奇则交换;3) 奇偶则prev前进;4) 双奇则cur前进。最终返回调整后的数组即可。
2025-08-21 22:35:56
305
原创 力扣73:矩阵置零
这篇文章介绍了一个解决力扣73题"矩阵置零"的算法。题目要求在m×n矩阵中,若元素为0,则将其所在行和列全部置0,且必须使用原地算法。解决方案是:首先创建两个标记数组分别记录需要置零的行和列;然后遍历矩阵,遇到0元素时标记对应行和列;最后再次遍历矩阵,根据标记数组将对应行和列置0。这种方法时间复杂度为O(N^2),空间复杂度为O(m+n),满足原地算法的要求。文末提供了相应的C++代码实现。
2025-08-20 22:58:21
357
原创 力扣48:旋转矩阵
题目要求将n×n矩阵原地顺时针旋转90度。关键思路是通过四个位置为一组进行旋转交换:matrix[i][j] → matrix[j][n-i-1] → matrix[n-i-1][n-j-1] → matrix[n-j-1][i] → matrix[i][j]。遍历范围只需覆盖矩阵的四分之一区域(行n/2,列(n+1)/2),通过临时变量temp实现四个位置的循环赋值。该方法高效且满足原地操作要求,时间复杂度为O(n²)。
2025-08-20 22:52:29
1714
原创 力扣57:插入区间
题目要求在无重叠的有序区间列表中插入新区间并保持不重叠。思路是遍历原区间列表,处理三种情况:1)当前区间右边界小于新区间左边界,直接插入;2)当前区间左边界大于新区间右边界,先插入合并后的新区间再插入当前区间;3)区间重叠时合并左右边界。最后检查是否已插入新区间,若未插入则作为最后一个区间加入。代码通过维护合并后的左右边界和插入标志位,最终生成正确结果。时间复杂度O(n)。
2025-08-19 22:40:10
316
原创 力扣56:合并区间
摘要 题目要求合并重叠区间。解法思路是先将区间按左边界排序,然后逐个处理:如果当前区间左边界大于结果数组中最后一个区间的右边界,则直接加入;否则合并区间,更新右边界。代码实现中,首先对输入区间排序,然后遍历处理,维护结果数组,最终返回合并后的区间数组。时间复杂度主要取决于排序步骤,为O(nlogn)。
2025-08-19 22:30:55
209
原创 力扣32:最长有效括号
这篇文章介绍了力扣第32题"最长有效括号"的两种解法:栈方法和动态规划。栈方法通过维护栈底最后一个无效右括号下标来计算有效长度;动态规划则利用数组记录以每个位置结尾的有效子串长度,处理右括号时考虑与前一个字符的匹配情况。两种方法的时间复杂度均为O(n),空间复杂度分别为O(n)和O(n)。文章提供了完整的C++实现代码,适合学习括号匹配问题和动态规划应用。
2025-08-18 23:16:14
511
原创 力扣70:爬楼梯
摘要:爬楼梯问题要求计算爬到n阶楼梯的不同方法数,每次可爬1或2阶。通过观察前几阶的解法(1,2,3,5),发现规律f(n)=f(n-1)+f(n-2),即斐波那契数列。采用动态规划思想,从底层逐步计算到第n层,避免重复计算。代码实现时初始化前两阶结果,通过循环从第三阶开始依次计算并更新中间值,最终返回第n阶的解。时间复杂度O(n),空间复杂度O(1)。
2025-08-18 22:52:33
367
原创 力扣438:找到字符串中所有的字母异位词
题目要求找出字符串s中所有与p的字母异位词子串的起始索引。通过滑动窗口法,维护一个与p等长的窗口在s上滑动。每次窗口移动时,比较窗口内字符频次与p的字符频次,若相同则为异位词。使用两个26位数组分别记录p和当前窗口的字符频次,通过数组比对快速判断是否为异位词。时间复杂度O(n),空间复杂度O(1)。该方法高效地解决了字母异位词的查找问题。
2025-08-17 21:30:12
317
原创 力扣3:无重复字符的最长子串
本文介绍了力扣第3题"无重复字符的最长子串"的解法。通过滑动窗口和哈希表的方法,维护左右边界来寻找最长无重复子串。具体实现是:右边界逐个扩展,当遇到重复字符时移动左边界直至消除重复,同时用哈希表记录字符是否存在。时间复杂度为O(n),空间复杂度为O(字符集大小)。该方法高效地解决了字符串中最长无重复子串长度的问题。
2025-08-17 21:21:26
246
原创 力扣326:3的幂
本文介绍了力扣326题判断一个数是否为3的幂次方的解法。关键思路是:3的幂次方数可以一直整除3直到结果为1,且每次除3的余数都为0。给出的C++代码通过循环除3并检查余数是否为0来实现这一判断,最终若结果为1则返回true,否则返回false。该解法简单高效,时间复杂度为O(log₃n)。
2025-08-15 21:48:18
362
原创 力扣400:第N位数字
题目要求在无限整数序列中找出第n位数字。解题思路分为两步:首先确定数字的位数d,通过减去不同位数的位数和来定位;然后计算具体数字及其第几位。代码实现时,先循环确定位数d,再计算目标数字在d位数中的位置,最后提取对应位上的数字。例如,对于n=11,返回0("12345678910"的第11位)。该方法通过数学计算高效定位所需数字。
2025-08-15 21:41:57
774
原创 力扣25:k个一组翻转链表
题目要求将链表每k个节点一组进行翻转,不足k个的保持原顺序。解题思路是分组处理:先计算链表长度,然后每组进行翻转操作。使用双指针法翻转每组节点,同时维护哨兵节点处理翻转后的连接问题。关键点在于翻转后重新连接各组,确保链表结构正确。时间复杂度O(n),空间复杂度O(1)。
2025-08-14 23:26:54
307
原创 力扣337:打家劫舍Ⅲ
这是一道关于二叉树动态规划的问题。题目要求在不抢劫相邻节点的情况下,计算二叉树中可获得的最大金额。解题思路是使用深度优先搜索结合动态规划:对每个节点分别计算选择该节点和不选择该节点两种情况下的最大金额,其中选择时不能选子节点,不选时则取子节点选或不选的最大值之和。通过递归遍历整棵树并用哈希表存储中间结果,最终返回根节点选与不选的最大值。该算法的时间复杂度为O(n),空间复杂度为O(n)。
2025-08-14 23:08:00
355
原创 力扣121:买卖股票的最佳时机
摘要:题目要求在给定股票价格数组中找到最佳买卖时机以获得最大利润。解题思路是跟踪最低买入价和当前最大利润。通过遍历数组,不断更新最低价格和计算当前卖出利润,最终返回最大利润值。代码使用minprice记录历史最低价,maxprofit保存当前最大利润差,时间复杂度为O(n)。若无法获利则返回0。
2025-08-13 21:27:55
335
原创 力扣42:接雨水
题目要求计算柱子排列后能接的雨水量。关键在于每个位置的接水量取决于其左右两侧最高柱子的较小值与当前柱子高度的差值。解法是维护两个数组:leftheight记录每个位置左侧最高柱子(含自身),rightheight记录右侧最高柱子(含自身)。遍历数组后,每个位置的接水量为min(leftheight[i], rightheight[i]) - height[i],最后累加所有位置的接水量即为答案。时间复杂度O(n),空间复杂度O(n)。
2025-08-13 21:24:44
320
原创 力扣47:全排列Ⅱ
摘要: 本题要求返回包含重复数字序列的所有不重复全排列。使用回溯算法,通过交换元素固定位置来生成排列,避免使用额外空间。关键点在于:1) 当固定位置数等于数组长度时保存结果;2) 利用哈希表剪枝去重,跳过已处理的重复值。代码通过交换nums元素实现原地修改,提升效率。时间复杂度为O(n!),空间复杂度为O(n²)(递归栈及哈希表开销)。
2025-08-12 21:07:05
317
原创 力扣11:盛水最多的容器
摘要:力扣11题要求在给定数组中找到两条垂线,使其与x轴构成的容器能容纳最多水。解题关键在于计算容器的容积(长×宽),采用双指针法从数组两端向中间移动,每次移动较短的垂线,并更新最大容积。时间复杂度为O(n),空间复杂度O(1)。代码通过比较指针所指高度来动态调整指针位置,确保高效找到最优解。
2025-08-12 20:51:30
201
原创 力扣164:最大间距
摘要:本文解决力扣164题"最大间距",要求在无序数组排序后找出相邻元素的最大差值。关键挑战是设计线性时间复杂度的算法。通过分析常见排序方法,选择基数排序实现O(n)时间空间复杂度。代码实现中,首先处理特殊情况,然后使用基数排序对数组排序,最后遍历排序后的数组计算最大相邻差值。该方法满足题目对线性时间复杂度和线性空间复杂度的要求。
2025-08-11 23:20:35
204
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅