
每日算法
文章平均质量分 74
迪小莫学AI
人工智能专业
展开
-
好数对的数目
这道题目要求我们找出满足 nums[i] == nums[j] 且 i < j 的所有数对。对于每个出现过的数,我们可以利用哈希表来统计它出现的次数,然后通过组合的方式计算好数对的数量。如果一组数字 (i, j) 满足 nums[i] == nums[j] 且 i < j,就可以认为这是一组 好数对。有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5),下标从 0 开始。输入:nums = [1,2,3,1,1,3]输入:nums = [1,1,1,1]返回 好数对 的数目。原创 2025-04-19 00:15:00 · 379 阅读 · 0 评论 -
统计坏数对的数目
nums[j] - nums[i] 的数对 (i, j)。实际上,我们可以通过观察发现 x - i 是一个关键的值,对于每个数对 (i, j),x - i 会在遍历时重复出现。= nums[j] - nums[i],那么我们称 (i, j) 是一个 坏数对。计算总组合数:ans = comb(len(nums), 2) 计算从 len(nums) 个元素中选取 2 个元素的组合数。数对 (1, 2) 是坏数对,因为 2 - 1!= 3 - 1,1!数对 (2, 3) 是坏数对,因为 3 - 2!原创 2025-04-18 09:03:02 · 292 阅读 · 0 评论 -
`97. 交错字符串` 题解与优化
设dfs(i, j)表示s1[0:i]和s2[0:j]能否组成。原创 2025-04-17 13:53:08 · 389 阅读 · 0 评论 -
`97. 交错字符串` 题解与优化
设dfs(i, j)表示s1[0:i]和s2[0:j]能否组成。原创 2025-04-14 14:04:45 · 205 阅读 · 0 评论 -
72. 编辑距离(Edit Distance)详细题解
设dfs(i, j)表示将s[0:i]转换为t[0:j]所需的最小操作数。题目方法时间复杂度空间复杂度交错字符串记忆化DFS / DPO(n·m)O(n·m)编辑距离记忆化DFS / DPO(n·m)原创 2025-04-14 14:03:59 · 411 阅读 · 0 评论 -
416. 分割等和子集
输入:nums = [1, 5, 11, 5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11]。综合起来:dp[i][j] = dp[i-1][j] or dp[i-1][j - nums[i-1]]如果 j >= nums[i],选第 i 个元素:dfs(i - 1, j - nums[i])如果选第 i 个元素:dp[i][j] = dp[i-1][j - nums[i-1]]如果不选第 i 个元素:dp[i][j] = dp[i-1][j]方法二:DFS + 记忆化搜索。原创 2025-04-07 11:18:09 · 430 阅读 · 0 评论 -
LeetCode 2874. 有序三元组中的最大值 II - 题解与优化
我们需要计算所有 (i, j, k) 满足 i < j < k 的 (nums[i] - nums[j]) * nums[k],要求找出最大值。给你一个下标从 0 开始的整数数组 nums,请你从所有满足 i < j < k 的下标三元组 (i, j, k) 中,找出并返回下标三元组的最大值。(diff) * nums[k],其中 diff = nums[i] - nums[j][1,10,3,4,19] 133 (1,2,4) 最大。[12,6,1,2,7] 77 (0,2,4) 最大。原创 2025-04-07 11:17:23 · 295 阅读 · 0 评论 -
[特殊字符] LeetCode 1123. 最深叶节点的最近公共祖先 | DFS后序遍历题解
给你一棵二叉树,返回。35 1/| |6 2 0 87 4python复制编辑最深叶子节点是 7 和 4,它们的最近公共祖先是节点 2。原创 2025-04-06 13:10:50 · 357 阅读 · 0 评论 -
LeetCode 1863. 找出所有子集的异或总和再求和
给定一个数组nums,我们要找到所有子集的异或总和,并返回这些总和的。示例:输入: nums = [1,3] 输出: 6 解释: 子集有 [], [1], [3], [1,3] 异或值分别为 0, 1, 3, 1^3=2 总和为 0+1+3+2 = 6python复制编辑。原创 2025-04-06 13:10:13 · 276 阅读 · 0 评论 -
解题思路:LeetCode 2711. 对角线上不同值的数量差
通过预处理对角线上的不同值数量,我们可以显著减少重复计算,从而优化算法的时间复杂度。优化后的算法在处理大规模矩阵时更加高效,同时保持了代码的简洁性。希望这篇博客能帮助你更好地理解和解决这个问题。原创 2025-03-25 10:24:06 · 294 阅读 · 0 评论 -
LeetCode 2711:对角线上不同值的数量差解题思路与优化方法
通过预处理对角线上的不同值数量,我们可以显著减少重复计算,从而优化算法的时间复杂度。优化后的算法在处理大规模矩阵时更加高效,同时保持了代码的简洁性。希望这篇博客能帮助你更好地理解和解决这个问题。原创 2025-03-25 09:09:10 · 512 阅读 · 0 评论 -
LeetCode 1092:最短公共超序列
从朴素递归到记忆化搜索,再到动态规划,我们逐步优化了时间和空间复杂度。这道题的关键在于理解子问题递归关系,并通过 DP 高效构造答案。希望这篇博客能帮助你掌握双序列动态规划的思考过程!原创 2025-03-24 13:46:13 · 983 阅读 · 0 评论 -
LeetCode 2255:统计是给定字符串前缀的字符串数目
是一道简单题。题目要求我们在一个字符串数组words中,统计有多少个字符串是给定字符串s的前缀。原创 2025-03-24 13:45:33 · 579 阅读 · 0 评论 -
2680. 最大或值
本题主要利用了位运算和前后缀分解预处理技巧,实现高效的计算。贪心思想确保了算法的正确性,前后缀技巧保证了算法高效性。类似的前后缀处理技巧在很多场景下都非常有用,值得掌握。掌握以上方法后,可尝试进一步优化,如实现空间复杂度为O(1)的算法,以更深刻理解此题。原创 2025-03-21 10:44:37 · 342 阅读 · 0 评论 -
LeetCode 2610. 转换二维数组
本题的关键在于如何通过Counter统计每个数字的频次,然后通过动态构建每一行来满足题目要求。通过不断选择可以放置在同一行的不同元素,我们可以实现尽可能少的行数,从而得到一个符合条件的二维数组。原创 2025-03-19 14:10:35 · 566 阅读 · 0 评论 -
LeetCode 1105. 填充书架
本题的关键在于动态规划的设计,如何利用dp[i]记录前i本书的最小高度,并通过状态转移更新最优解。通过不断尝试不同的层数和放置方式,可以得到最小的书架高度。原创 2025-03-19 14:08:53 · 348 阅读 · 0 评论 -
动态规划与字符串处理
整除子集是指子集中的每一对 (i, j) 满足 nums[i] % nums[j] == 0 或 nums[j] % nums[i] == 0。给定一个字符串 s,计算该字符串的分数,定义为相邻字符的 ASCII 码差值的绝对值之和。动态规划:我们维护一个 f 数组,表示以 nums[i] 作为结尾的最大整除子集的大小,并通过 g 数组记录每个元素的前驱索引。回溯:遍历 f 数组,找到最大的子集长度,并通过 g 数组回溯得到子集的元素。时间复杂度:O(n),其中 n 是字符串的长度,遍历一次字符串即可。原创 2025-03-15 13:33:19 · 652 阅读 · 0 评论 -
最长递增子序列的个数(Number of Longest Increasing Subsequences)
本题核心:基于动态规划解决最长递增子序列问题,并额外维护count数组统计 LIS 个数。状态转移方程:基于dp[i]的变化更新count[i]。时间复杂度On2O(n^2)On2,但可以使用更高级的数据结构优化。这道题考察了动态规划的细节处理,尤其是如何统计方案个数,是面试中的高频题目。希望这篇博客能帮助你理解和掌握这个动态规划题目!原创 2025-03-14 09:26:27 · 414 阅读 · 0 评论 -
滑动窗口与双指针总结与题解
(‘a’, ‘e’, ‘i’, ‘o’, ‘u’)至少一次,并且。滑动窗口是一种用于数组和字符串问题的优化技术,适用于。原创 2025-03-12 10:08:45 · 980 阅读 · 0 评论 -
数组美丽值求和 (Leetcode 2012)
暴力解法时间复杂度O(n^2),不可行。通过前缀最大值和后缀最小值优化,时间复杂度降至O(n)。该方法适用于需要动态查询区间最大/最小值的问题。原创 2025-03-11 14:55:49 · 391 阅读 · 0 评论 -
利用前缀异或和解决区间异或查询问题
通过前缀异或和技巧,我们可以高效地解决区间异或查询问题。前缀异或和不仅能够加速查询过程,还能应用于其他类似的问题,值得在处理数组区间问题时进行考虑。# Step 1: 构造前缀异或和n=len(arr)res=[]# Step 2: 计算每个查询结果return res# 利用前缀异或和计算区间 [l, r] 的异或值这道题类似于构建前缀和,这里可以用的是异或前缀和。原创 2025-03-08 12:31:34 · 898 阅读 · 0 评论 -
2234. 花园的最大总美丽值 - 题解
通过上述优化,我们能够高效地计算出最多能达到的总美丽值。算法充分利用了前缀和与贪心策略,保证了时间复杂度的优化。对于大数据量的输入,也能高效运行。原创 2025-03-08 12:30:56 · 758 阅读 · 0 评论 -
美丽子集的数目
该方法利用回溯枚举所有可能的子集,并通过cnt哈希表剪枝,保证子集是美丽的。由于的上限较小(最多 18),该解法在实际运行中是可行的。本题属于典型的子集回溯问题,可以作为类似问题的参考。原创 2025-03-07 13:39:18 · 711 阅读 · 0 评论 -
LeetCode 560 & 303:前缀和思想解析**
掌握这个技巧,你将更轻松地应对数组子区间和相关问题!记录前缀和,快速查找。这道题的关键点是利用。原创 2025-03-06 10:43:55 · 345 阅读 · 0 评论 -
LeetCode 2588: 统计美丽子数组数目
给你一个下标从 0 开始的整数数组nums。ijknums[i]nums[j]knums[i]nums[j]2^k如果一个子数组内执行上述操作若干次后,该子数组可以变成一个全为0的数组,那么我们称它是一个。请你返回数组nums中的数目。原创 2025-03-06 10:42:24 · 481 阅读 · 0 评论 -
破坏回文串(Greedy)| 类比数字排序 | Python 解法解析
✅如果字符串中有非'a',修改最左边的非'a'为'a',保证字典序最小。✅如果字符串全是'a',修改最后一个'a'为'b',仍然最小但确保非回文。✅这与数字排序类似,优先修改高位保证整体字典序最小。希望这篇博客对你有所帮助!如果有任何问题或优化方案,欢迎讨论!🎯🚀。原创 2025-03-05 17:23:44 · 448 阅读 · 0 评论 -
1004. 最大连续 1 的个数 III | 滑动窗口解法
滑动窗口是本题的最优解,保证。时间复杂度解决问题!原创 2025-03-02 21:03:32 · 545 阅读 · 0 评论 -
132. 分割回文串 II | 最少分割次数
暴力回溯只能用于求所有划分方案,但无法高效求最优解。动态规划(DP)是最优解,预处理回文后,可以在O(n^2)时间内求解最少分割次数。预处理可以减少重复计算,提升性能。📌动态规划是求解最少分割次数的最佳方法!原创 2025-03-02 20:29:14 · 353 阅读 · 0 评论 -
摆动序列问题解析与解法
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。是摆动序列,因为其差值为 (6, -3, 5, -7, 3),这是一组正负交替出现的数列。先是一个正差(上升),然后是负差(下降),再然后是正差(上升),以此类推。如果两个相邻元素相等,则无法定义为上升或下降。这个问题可以通过动态规划思想来解决,保持记录当前上升和下降的序列长度,然后根据当前元素的大小更新状态。通过这种方式,我们能够在O(n)时间内找到最优解。同时,我们也避免了使用额外的二维数组,从而降低了空间复杂度。原创 2025-03-01 03:20:51 · 444 阅读 · 0 评论 -
131. 分割回文串
给你一个字符串s,请你将s分割成一些子串,使每个子串都是。返回s所有可能的分割方案。原创 2025-03-01 02:50:52 · 340 阅读 · 0 评论 -
1472.设计浏览器历史记录
visit 就是清空之前访问过的历史记录,把当前的放进去。self.cur+=1代表进下一个访问。然后删掉 当前的和之前的,加入新的。用一个列表来存储浏览器的历史记录。cur指向当前浏览器记录的位置。这里是模拟浏览器的回退和前进。前进和回退要考虑边界。原创 2025-02-26 18:52:37 · 274 阅读 · 0 评论 -
与车相交的点
这道题目考察了如何处理区间的合并问题。在解决过程中,利用排序和合并技巧,可以高效地计算被多个区间覆盖的整数点数。通过这种方法,我们能够确保在较小的输入规模下快速求解问题。如果区间数量更大,仍然可以在O(n log n)时间内处理完成。希望这篇文章对你有所帮助,祝你在编码过程中顺利!原创 2025-02-22 13:44:25 · 329 阅读 · 0 评论 -
2595.奇偶位数
然后遍历,这里有个技巧,是从右往左遍历的。利用n.bit_length()取出n变成二进制的位数。原创 2025-02-20 20:35:47 · 153 阅读 · 1 评论 -
如何计算和为奇数的子数组数量 对应力扣 代码 1524. 和为奇数的子数组数目 难度分1624
子数组是指从原数组中选取一段连续的元素组成的数组。与之不同的是,子序列可以从数组中选取任意的元素,可以是不连续的。因此,在这道题中,我们只需要关心连续的部分,而不是不连续的部分。通过利用前缀和的奇偶性,我们可以在一次遍历中高效地计算和为奇数的子数组数量,而无需暴力枚举所有子数组。这种方法大大提高了算法的效率,解决了题目对于大规模数据的要求。原创 2025-02-18 00:30:00 · 365 阅读 · 0 评论 -
将每个元素替换为右侧最大元素
这个问题通过从右到左遍历数组,并使用一个变量来跟踪右侧的最大值,能够有效地完成替换操作。这样的做法使得我们能够在O(n)的时间内完成任务,且不需要额外的空间。原创 2025-02-16 21:17:33 · 460 阅读 · 0 评论 -
2517. 礼盒的最大甜蜜度(Maximum Tastiness of Candy Box)
本题通过对糖果价格数组排序,并利用二分查找和贪心策略来最大化糖果礼盒的甜蜜度。这个解法不仅高效,还能通过二分查找不断逼近最优解,从而找到最大的甜蜜度。原创 2025-02-15 15:49:44 · 254 阅读 · 0 评论 -
解题博客:LeetCode 1706. 球会落何处
这道题目主要考察模拟和判断的能力,通过逐列模拟每颗球的下落过程,判断球是否会卡住,并记录球最终的落点。通过使用简单的循环和条件判断,我们能够高效地解决这个问题。原创 2025-02-15 15:45:39 · 847 阅读 · 0 评论 -
组合问题 - 深度优先搜索(DFS)解题思路与代码实现
通过深度优先搜索(DFS)和回溯方法,我们能够有效地生成所有从1到n中选择k个数字的组合。每次选择一个数字时,我们递归地继续生成组合,并确保不重复选择数字。回溯保证了我们能够尝试所有可能的组合。希望这篇博客能够帮助你理解组合问题的解决方法。如果你有任何问题或疑问,欢迎在评论区留言讨论!原创 2025-01-31 00:30:00 · 1468 阅读 · 0 评论 -
【力扣每日一题】LeetCode 2412: 完成所有交易的初始最少钱数
通过这个问题,我们可以学习到如何通过分解交易中的不同部分来分析最小初始资金。理解了如何计算资金缺口和最小需要的额外资金后,可以高效地得出最少初始资金。这个方法适用于交易顺序不确定的情况下,保证无论如何都能顺利完成所有交易。原创 2025-01-26 00:00:00 · 599 阅读 · 0 评论 -
2266. 统计打字方案数 全网最通俗易懂解释
不同的字母之间相乘这里就直接用f[]和m[]列表来存储掉有多少种可能这里一下就算了所有的字母就不用重复算了因为每个字母都是一样的。这道题的数据范围是10**5次方,未来加快速度不用每次都算一遍,首先就把所有的数组都算好。写一个变量1_000_000_007python是可以用下划线来划分的。对列表f[]m[]就是分别对应这个有3个字母的按钮,有4个字母的按钮。对于234568一共是按前三次有不同的字母对应。这里的下标1就代表有一个连续的时候可能的情况。原创 2025-01-19 15:34:58 · 176 阅读 · 0 评论