
算法题
文章平均质量分 87
算法题
程序猿进阶
要做就做第一,就算结果不是第一,也会是一个好成绩。 加油!我的未来不是梦。
展开
-
N 皇后 II
回溯的具体做法是:依次在每一行放置一个皇后,每次新放置的皇后都不能和已经放置的皇后之间有攻击,即新放置的皇后不能和任何一个已经放置的皇后在同一列以及同一条斜线上。右移一位,由于棋盘的最左列对应每个整数的最低二进制位,即每个整数的最右二进制位,因此对整数的移位操作方向和对棋盘的移位操作方向相反(对棋盘的移位操作方向是。对于每个方向的斜线,需要找到斜线上的每个位置的行下标与列下标之间的关系。每次放置皇后时,三个整数的按位或运算的结果即为不能放置皇后的位置,其余位置即为可以放置皇后的位置。原创 2024-12-23 00:15:00 · 1021 阅读 · 0 评论 -
O(1)插入、删除和随机元素
删除操作的重点在于将变长数组的最后一个元素移动到待删除元素的下标处,然后删除变长数组的最后一个元素。获取随机元素操作时,由于变长数组中的所有元素的下标都连续,因此随机选取一个下标,返回变长数组中该下标处的元素。,且可以保证在删除操作之后变长数组中的所有元素的下标都连续,方便插入操作和获取随机元素操作。,需要将变长数组和哈希表结合,变长数组中存储元素,哈希表中存储每个元素在变长数组中的下标。的时间内完成插入和删除操作,但是由于无法根据下标定位到特定元素,因此不能在。的时间内判断元素是否存在,因此不能在。原创 2024-12-18 00:15:00 · 1715 阅读 · 0 评论 -
两数之和(Hash表)
但是我想偏了,我一直想的是在三数之和中如果当前数和前一个数相等,那么会直接跳过。这里的话应该是可以根据前一个数对答案的贡献度直接推出来当前数的贡献度的。所以刚开始的思路就是先统计每一个数出现的次数,然后再按照两数之和的方法去算,只不过算的时候要考虑两个数出现的次数相乘才是所有的组合。面试完又想了一下另一个思路,可以按照三数之和内层循环的思路,用两个指针分别指向首尾,,那么可以不用计算,直接加上上一次的答案,同理,第一次遇到2也是,但是由于。的时候,不能直接加上上一次的答案,应该加上上一次的答案。原创 2024-12-17 00:15:00 · 853 阅读 · 1 评论 -
两条链表相同位数相加
优质博文。原创 2024-12-11 00:15:00 · 1351 阅读 · 0 评论 -
快乐数题解
在龟兔赛跑的寓言中,跑的慢的称为 “乌龟”,跑得快的称为 “兔子”。该分析建立在对前一种方法的分析的基础上,但是这次我们需要跟踪两个指针而不是一个指针来分析,以及在它们相遇前需要绕着这个循环走多少次。因此,我们可以硬编码一个包含这些数字的散列集,如果我们达到其中一个数字,那么我们就知道在循环中。的数字,用这么小的数字,编写一个能找到所有周期的强力程序并不困难。我们不是只跟踪链表中的一个值,而是跟踪两个值,称为快跑者和慢跑者。2、要计算出总的时间复杂度,我们需要仔细考虑循环中有多少个数字,它们有多大。原创 2024-12-04 00:15:00 · 973 阅读 · 1 评论 -
无重复字符的最长子串
在每一步的操作中,我们会将左指针向右移动一格,表示 我们开始枚举下一个字符作为起始位置,然后我们可以不断地向右移动右指针,但需要保证这两个指针对应的子串中没有重复的字符。在左指针向右移动的时候,我们从哈希集合中移除一个字符,在右指针向右移动的时候,我们往哈希集合中添加一个字符。为例,找出从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。我们使用两个指针表示字符串中的某个子串(或窗口)的左右边界,其中左指针代表着上文中「枚举子串的起始位置」,而右指针即为上文中的。原创 2024-11-29 00:15:00 · 787 阅读 · 3 评论 -
验证回文串
在移动任意一个指针时,需要不断地向另一指针的方向移动,直到遇到一个字母或数字字符,或者两指针重合为止。也就是说,我们每次将指针移到下一个字母字符或数字字符,再判断这两个指针指向的字符是否相同。初始时,左右指针分别指向字符串的两侧,随后我们不断地将这两个指针相向移动,每次移动一步,并判断这两个指针指向的字符是否相同。的两侧,随后我们不断地将这两个指针相向移动,每次移动一步,并判断这两个指针指向的字符是否相同。由于我们需要将所有的字母和数字字符存放在另一个字符串中,在最坏情况下,新的字符串。原创 2024-11-26 00:15:00 · 613 阅读 · 2 评论 -
买卖股票的最佳时机 II[中等]
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。注意到上面的状态转移方程中,每一天的状态只与前一天的状态有关,而与更早的状态都无关,因此我们不必存储这些无关的状态,只需要将。由于全部交易结束后,持有股票的收益一定低于不持有股票的收益,因此这时候。的转移方程,如果这一天交易完后手里没有股票,那么可能的转移状态为前一天已经没有股票,即。,按照同样的方式考虑转移状态,那么可能的转移状态为前一天已经持有一支股票,即。原创 2024-11-28 00:15:00 · 515 阅读 · 2 评论 -
串联所有单词的子串[困难]
每次滑动窗口时,需要用一个哈希表保存单词频次。然后将窗口右移,右侧会加入一个单词,左侧会移出一个单词,并对。中单词频次相同,窗口的左端点是一个待求的起始位置。时,出现在窗口中的单词,每出现一次,相应的值增加。的任何顺序排列的连接。个字母后,将剩下的字母进行划分,如果末尾有不到。中所有字符串以任意顺序排列连接起来的子串。次滑动窗口后,即可找到所有的起始位置。中的单词,每出现一次,相应的值减少。划分为单词组,每个单词的大小均为。,则表示这个窗口中的单词频次和。,连接的子字符串的长度必须为。原创 2024-11-27 00:15:00 · 775 阅读 · 0 评论 -
建立四叉树
如果是,那么这一部分对应的是一个叶节点,我们构造出对应的叶节点并结束递归;如果不是,那么这一部分对应的是一个非叶节点,我们需要将其分成四个部分:行的分界线为。,那么说明这一部分包含的元素大部分都是相同的,也就是说,有很大概率在深入递归时遇到元素完全相同的一部分,从而提前结束递归。函数得到四个部分对应的树,再将它们对应地挂在非叶节点的四个子节点上。设为任意值,然后如下图所示,将当前网格划分为四个子网格。解释:此示例的解释如下:请注意,在下面四叉树的图示中,时,它的和为这一部分的面积大小。原创 2024-11-25 00:15:00 · 1057 阅读 · 1 评论 -
合并 K 个升序链表
所指向的元素处于「待合并」的状态,也就是说它们还没有合并入最终的链表。以下是合并的步骤和注意事项,对这个问题比较熟悉的读者可以跳过这一部分。在解决「合并K个排序链表」这个问题之前,我们先来看一个更简单的问题:如何合并两个有序链表?请你将所有链表合并到一个升序链表中,返回合并后的链表。这个方法和前两种方法的思路有所不同,我们需要维护当前每个链表没有被合并的元素的最前面一个,属性不保存任何值),这是为了方便代码的书写,在整个链表合并完之后,返回它的下一位置即可。,我们的宗旨是「原地调整链表元素的。原创 2024-11-22 00:15:00 · 701 阅读 · 0 评论 -
最大子数组和
当然,如果读者有兴趣的话,推荐阅读线段树区间合并法解决多次询问的「区间最长连续上升序列问题」和「区间最大子段和问题」,还是非常有趣的。「方法二」相较于「方法一」来说,时间复杂度相同,但是因为使用了递归,并且维护了四个信息的结构体,运行的时间略长,空间复杂度也不如方法一优秀,而且难以理解。的时间内求到任意区间内的答案,对于大规模查询的情况下,这种方法的优势便体现了出来。的时间内求到任意区间内的答案,我们甚至可以修改序列中的值,做一些简单的维护,之后仍然可以在。区间内的最大子段和,那么最终我们要求的答案就是。原创 2024-11-21 00:15:00 · 861 阅读 · 1 评论 -
环形子数组的最大和
形式上,对于子数组 nums[i], nums[i + 1], …对于第二种情况,即环形数组的最大子数组和为 nums[0:i] 和 nums[j:n],我们可以找到普通数组最小的子数组 nums[i:j] 即可。形式上, nums[i] 的下一个元素是 nums[(i + 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 + n) % n]。构成最大子数组和的子数组为 nums[i:j],包括 nums[i] 到 nums[j−1] 共 j−i 个元素,其中 0≤i原创 2024-11-20 00:15:00 · 942 阅读 · 0 评论 -
搜索插入位置
二分查找」的写法很多、细节也很多。希望大家一定要有耐心,遇到问题的时候自己调试,把变量的值打印出来看一眼。我相信,真正掌握「二分查找」的朋友,不是因为他(她)背下了「二分查找」的模板,而是他(她)对题目的意思有准确的理解。就本题而言,一定要分析出:1、数组的长度有可能是问题的答案,也就是。原创 2024-11-19 00:15:00 · 844 阅读 · 0 评论 -
寻找峰值-算法
优质博文。原创 2024-10-31 00:15:00 · 1380 阅读 · 0 评论 -
搜索旋转排序数组
优质博文。原创 2024-11-01 00:15:00 · 810 阅读 · 2 评论 -
寻找旋转排序数组中的最小值
优质博文。原创 2024-10-25 00:15:00 · 1365 阅读 · 2 评论 -
寻找两个正序数组的中位数
k/2−2],即 k/2−1 个元素,对于 A[k/2−1] 和 B[k/2−1] 中的较小值,最多只会有 (k/2−1)+(k/2−1)≤k−2 个元素比它小,那么它就不能是第 k 小的数了。如果 A[k/2−1]原创 2024-10-22 00:15:00 · 958 阅读 · 0 评论 -
数组中的第K个最大元素
由此可以发现每次经过「划分」操作后,我们一定可以确定一个元素的最终位置,即 x 的最终位置为 q,并且保证 a[l⋯q−1] 中的每个元素小于等于 a[q],且 a[q] 小于等于 a[q+1⋯r] 中的每个元素。我们只关心这一点,至于 a[l⋯q−1] 和 a[q+1⋯r] 是否是有序的,我们不关心。分解: 将数组 a[l⋯r] 「划分」成两个子数组 a[l⋯q−1]、a[q+1⋯r],使得 a[l⋯q−1] 中的每个元素小于等于 a[q],且 a[q] 小于等于 a[q+1⋯r] 中的每个元素。原创 2024-10-16 00:15:00 · 620 阅读 · 1 评论 -
IPO怎么实现
我们首先将项目按照所需资本的从小到大进行排序,每次进行选择时,假设当前手中持有的资本为 w,我们应该从所有投入资本小于等于 w 的项目中选择利润最大的项目 j,然后此时我们更新手中持有的资本为 w+profits[j],同时再从所有花费资本小于等于 w+profits[j] 的项目中选择,我们按照上述规则不断选择 k 次即可。我们利用大根堆的特性,我们将所有能够投资的项目的利润全部压入到堆中,每次从堆中取出最大值,然后更新手中持有的资本,同时将待选的项目利润进入堆,不断重复上述操作。原创 2024-10-15 00:15:00 · 648 阅读 · 4 评论 -
查找和最小的 K 对数字
利用滑动窗口即可计算出两个数组中满足数对和小于等于目标值 target 的数对有多少个,我们找到最小的 target 且满足小于等于它的数对数目刚好大于等于 k 即为目标值 pairSum,然后在数组中找到最小的 k 个数对满足数对和小于等于 pairSum。)),我们利用滑动窗口找到小于等于目标值的 k 个数对的时间复杂度为 O(2×(k+m+n)),所以总的时间复杂度 O(2×(k+m+n)+(m+n)×log(diff(nums。+1),假设我们利用堆的特性可以求出待选范围中最小数对的索引为 (a。原创 2024-10-14 00:15:00 · 671 阅读 · 1 评论 -
二进制求和
接着每一轮中,由于 carry 是由 x 和 y 按位与并且左移得到的,那么最后会补零,所以在下面计算的过程中后面的数位不受影响,而每一轮都可以得到一个低 i 位的答案和它向低 i+1 位的进位,也就模拟了加法的过程。这里的代码给出第一种的实现。O(∣a∣+∣b∣+X⋅max(∣a∣+∣b∣)),字符串转化成数字需要的时间代价为 O(∣a∣+∣b∣),计算的时间代价为 O(max{∣a∣,∣b∣}),X 为位运算所需的时间,因为这里用到了高精度计算,所以位运算的时间不一定为 O(1)。原创 2024-10-08 00:15:00 · 851 阅读 · 2 评论 -
颠倒二进制位
在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。类似地,对于倒数第二层,每两位分一组,按组号取出所有奇数组和偶数组,然后将奇数组移到偶数组上,偶数组移到奇数组上。需要注意的是,在某些语言(如 Java)中,没有无符号整数类型,因此对 n 的右移操作应使用逻辑右移。需要注意的是,在某些语言(如 Java)中,没有无符号整数类型,因此对 n 的右移操作应使用逻辑右移。将奇数位移到偶数位上,偶数位移到奇数位上。原创 2024-10-07 00:15:00 · 360 阅读 · 2 评论 -
位1的个数
这样我们可以利用这个位运算的性质加速我们的检查过程,在实际代码中,我们不断让当前的 n 与 n−1 做与运算,直到 n 变为 0 即可。因为每次运算会使得 n 的最低位的 1 被翻转,因此运算次数就等于 n 的二进制位中 1 的个数。我们需要检查 n 的二进制位的每一位,一共需要检查 32 位。思路及解法:观察这个运算:n & (n−1),其运算结果恰为把 n 的二进制位中的最低位的 1 变为 0 之后的结果。,运算结果 4 即为把 6 的二进制位中的最低位的 1 变为 0 之后的结果。原创 2024-10-04 00:15:00 · 530 阅读 · 8 评论 -
只出现一次的数字
由于集合保证元素无重复,因此计算集合中的所有元素之和的两倍,即为每个元素出现两次的情况下的元素之和。由于数组中只有一个元素出现一次,其余元素都出现两次,因此用集合中的元素之和的两倍减去数组中的元素之和,剩下的数就是数组中只出现一次的数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。遍历数组即可得到每个数字出现的次数,并更新哈希表,最后遍历哈希表,得到只出现一次的数字。做异或运算,结果仍然是原来的数,即。原创 2024-10-02 00:15:00 · 410 阅读 · 0 评论 -
只出现一次的数字 II
对于数组中非答案的元素,每一个元素都出现了 3 次,对应着第 i 个二进制位的 3 个 0 或 3 个 1,无论是哪一种情况,它们的和都是 3 的倍数(即和为 0 或 3)。既然我们在对两个整数进行普通的二元运算时,都是将它们看成整体进行处理的,那么我们是否能以普通的二元运算为基础,同时处理所有的二进制位?这样一来,对于数组中的每一个元素 x,我们使用位运算 (x >> i) & 1 得到 x 的第 i 个二进制位,并将它们相加再对 3 取余,得到的结果一定为 0 或 1,即为答案的第 i 个二进制位。原创 2024-09-25 00:15:00 · 1291 阅读 · 28 评论 -
数字范围按位与
假设对于所有这些二进制串,前 i 位均相同,第 i+1 位开始不同,由于 [m,n] 连续,所以第 i+1 位在 [m,n] 的数字范围从小到大列举出来一定是前面全部是 0,后面全部是 1,在上图中对应 [9,11] 均为 0,[12,12] 均为 1。并且一定存在连续的两个数 x 和 x+1,满足 x 的第 i+1 位为 0,后面全为 1,x+1 的第 i+1 位为 1,后面全为 0,对应上图中的例子即为 11 和 12。我们的想法是将两个数字不断向右移动,直到数字相等,即数字被缩减为它们的公共前缀。原创 2024-09-23 00:15:00 · 1190 阅读 · 32 评论 -
是否为回文数
优质博文:IT-BLOG-CN给你一个整数 ,如果是一个回文整数,返回;否则,返回。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,是回文,而不是。示例 1:输入:输出:示例 2:输入:输出:解释:从左向右读, 为 。 从右向左读, 为 。因此它不是一个回文数。示例 3:输入:输出:解释:从右向左读, 为。因此它不是一个回文数。进阶:你能不将整数转为字符串来解决这个问题吗?方法一:反转一半数字思路映入脑海的第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,原创 2024-09-18 00:15:00 · 535 阅读 · 2 评论 -
阶乘后的零
中质因子 2 的个数和质因子 5 的个数的较小值。中质因子 5 的个数等于 [1,n] 的每个数的质因子 5 的个数之和,我们可以通过遍历 [1,n] 的所有 5 的倍数求出。⌋ 个,由于这些数已经是 p 的倍数了,为了不重复统计 p 的个数,我们仅考虑额外贡献的质因子个数,即这些数额外贡献了至少 n。由于质因子 5 的个数不会大于质因子 2 的个数(具体证明见方法二),我们可以仅考虑质因子 5 的个数。n 不变,p 越大,质因子个数越少,因此 [1,n] 中质因子 5 的个数不会大于质因子 2 的个数;原创 2024-09-16 00:15:00 · 451 阅读 · 0 评论 -
x 的平方根
二分查找的下界为 0,上界可以粗略地设定为 x。在二分查找的每一步中,我们只需要比较中间元素 mid 的平方与 x 的大小关系,并通过比较的结果调整上下界的范围。由于我们所有的运算都是整数运算,不会存在误差,因此在得到最终的答案 ans 后,也就不需要再去尝试 ans+1 了。每一次迭代后,我们都会距离零点更进一步,所以当相邻两次迭代得到的交点非常接近时,我们就可以断定,此时的结果已经足够我们得到答案了。本题是一道常见的面试题,面试官一般会要求面试者在不使用x函数的情况下,得到 x 的平方根的整数部分。原创 2024-09-12 00:15:00 · 968 阅读 · 3 评论 -
Pow(x, n)
在方法一中,我们也提到过,从左到右进行推导是不容易的,因为我们不知道是否需要额外乘 x。直接从左到右进行推导看上去很困难,因为在每一步中,我们不知道在将上一次的结果平方之后,还需不需要额外乘 x。,⋯,如果 n 的第 k 个(从右往左,从 0 开始计数)二进制位为 1,那么我们就将对应的贡献 x。因此我们借助整数的二进制拆分,就可以得到迭代计算的方法,一般地,如果整数 n 的二进制拆分为。的顺序,从 x 开始,每次直接把上一次的结果进行平方,计算 6 次就可以得到 x。O(logn),即为递归的层数。原创 2024-09-10 00:15:00 · 1126 阅读 · 32 评论 -
直线上最多的点数
当我们枚举到点 i 时,我们只需要考虑编号大于 i 的点到点 i 的斜率,因为如果直线同时经过编号小于点 i 的点 j,那么当我们枚举到 j 时就已经考虑过该直线了;于是我们可以统计其他所有点与点 i 所连直线的斜率,出现次数最多的斜率即为经过点数最多的直线的斜率,其经过的点数为该斜率出现的次数加一(点 i 自身也要被统计)。假设我们当前枚举到点 i,如果直线同时经过另外两个不同的点 j 和 k,那么可以发现点 i 和点 j 所连直线的斜率恰等于点 i 和点 k 所连直线的斜率。主要为哈希表的开销。原创 2024-09-06 00:15:00 · 1128 阅读 · 33 评论 -
爬楼梯[简单]
这里形成的数列正好是斐波那契数列,答案要求的 f(n) 即是斐波那契数列的第 n 项(下标从 0 开始)。我们来总结一下斐波那契数列第 n 项的求解方法:n 比较小的时候,可以直接使用过递归法求解,不做任何记忆化操作,时间复杂度是 O(2^n),存在很多冗余计算。一般情况下,我们使用「记忆化搜索」或者「迭代」的方法,实现这个转移方程,时间复杂度和空间复杂度都可以做到 O(n)。原创 2024-09-04 00:15:00 · 1101 阅读 · 23 评论 -
打家劫舍[中等]
如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到最高总金额。考虑到每间房屋的最高总金额只和该房屋的前两间房屋的最高总金额相关,因此可以使用滚动数组,在每个时刻只需要存储前两间房屋的最高总金额。偷窃第 k 间房屋,那么就不能偷窃第 k−1 间房屋,偷窃总金额为前 k−2 间房屋的最高总金额与第 k 间房屋的金额之和。在两个选项中选择偷窃总金额较大的选项,该选项对应的偷窃总金额即为前 k 间房屋能偷窃到的最高总金额。原创 2024-09-03 00:15:00 · 1425 阅读 · 15 评论 -
单词拆分[中等]
关于以上这段代码,条件dp[j] 的意思是s[0, j-1]的子字符串可被字典完全替换,而wordDictSet.contains(s.substring(j, i))的意思是字典内包含有字符串s[j, i-1]的词。对于检查一个字符串是否出现在给定的字符串列表里一般可以考虑哈希表来快速判断,同时也可以做一些简单的剪枝,枚举分割点的时候倒着枚举,如果分割点 j 到 i 的长度已经大于字典列表里最长的单词的长度,那么就结束枚举,但是需要注意的是下面的代码给出的是不带剪枝的写法。i−1]) 表示子串 s[j…原创 2024-08-28 00:15:00 · 923 阅读 · 22 评论 -
零钱兑换[中等]
其中 cj代表的是第 j 枚硬币的面值,即我们枚举最后一枚硬币面额是 cj,那么需要从 i−cj这个金额的状态 F(i−cj) 转移过来,再算上枚举的这枚硬币数量 1 的贡献,由于要硬币数量最少,所以 F(i) 为前面能转移过来的状态的最小值加上枚举的硬币数量 1。我们一共需要计算 S 个状态的答案,且每个状态 F(S) 由于上面的记忆化的措施只计算了一次,而计算一个状态的答案需要枚举 n 个面额值,所以一共需要 O(Sn) 的时间复杂度。我们一共需要计算 O(S) 个状态,S 为题目所给的总金额。原创 2024-08-27 00:15:00 · 1037 阅读 · 20 评论 -
最长递增子序列[中等]
因为如果 d[j]≥d[i] 且 jd[len] 则更新 len=len+1,否则在 d[1…原创 2024-08-23 00:15:00 · 813 阅读 · 10 评论 -
三角形最小路径和[中等]
但如果我们递增地枚举 j,那么在计算位置 (i,j) 时,f[0] 到 f[j−1] 已经是第 i 行的值。当我们在计算位置 (i,j) 时,f[j+1] 到 f[i] 已经是第 i 行的值,而 f[0] 到 f[j] 仍然是第 i−1 行的值。由于每一步只能移动到下一行「相邻的节点」上,因此要想走到位置 (i,j),上一步就只能在位置 (i−1,j−1) 或者位置 (i−1,j)。最终的答案即为 f[n−1][0] 到 f[n−1][n−1] 中的最小值,其中 n 是三角形的行数。原创 2024-08-21 00:15:00 · 985 阅读 · 35 评论 -
最小路径和[中等]
这是因为:grid[i][j] = min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j];=0时,dp[i][j]=min(dp[i−1][j],dp[i][j−1])+grid[i][j];=0时, dp[i][j]=dp[i][j−1]+grid[i][j];=0,j=0时, dp[i][j]=dp[i−1][j]+grid[i][j];当左边和上边都是矩阵边界时: 即当i=0,j=0时,其实就是起点, dp[i][j]=grid[i][j];原创 2024-08-20 00:15:00 · 956 阅读 · 32 评论 -
不同路径 II[中等]
当坐标 (i,j) 本身有障碍的时候,任何路径都到到不了 f(i,j),此时 f(i,j)=0;下面我们来讨论坐标 (i,j) 没有障碍的情况:如果坐标 (i−1,j) 没有障碍,那么就意味着从坐标 (i−1,j) 可以走到 (i,j),即 (i−1,j) 位置对 f(i,j) 的贡献为 f(i−1,j),同理,当坐标 (i,j−1) 没有障碍的时候,(i,j−1) 位置对 f(i,j) 的贡献为 f(i,j−1)。所以在遇到求方案数的问题时,我们可以往动态规划的方向考虑。网格的正中间有一个障碍物。原创 2024-08-19 00:15:00 · 950 阅读 · 16 评论