- 博客(52)
- 收藏
- 关注
原创 算法日记day 45(单调栈之每日温度|接雨水)
如果大于,则取栈顶元素为中间值并弹出栈顶元素,将遍历的元素与新的栈顶元素值比较取较小者,减去中间值得到高度h,然后栈顶元素下标值减去当前遍历的元素下标值再减一得到宽度w,最后高×宽得到面积,并记录,重复上述操作,直到遍历结束。第三种,如果遍历的元素值大于栈顶元素,用该下标减去栈顶元素下标,并将栈顶元素弹出,继续用该元素与新的栈顶元素比较,如果小于等于,则压入栈,如果大于,重复第三步操作。第一种,如果之后遍历的元素值小于栈顶压入的元素,将该元素的下标压入栈中。如果小于栈顶元素值,则压入栈内。
2024-08-22 17:27:46 2015
原创 算法日记day 44(动归之编辑距离|回文字串|最长回文子序列)
由于回文串的特殊性,如果 i 与 j 的值相同,当 i 与 j 的距离满足 j - i <= 2时,都符合回文串的条件因此定义一个res收集结果,同时dp[i][j]为true,如果此时距离大于2,则需要比较dp[i+1][j-1]的值是否为true,如果是,则说明dp[i][j]是回文串,如果 i 与 j 的值不相同,则表示不是回文串。又dp[i][j] 依赖于 dp[i + 1][j - 1] ,dp[i + 1][j] 和 dp[i][j - 1]
2024-08-21 18:13:22 771
原创 算法日记day 43(动归之不同的子序列|两个字符串的删除操作)
本题dp数组的含义是以i-1为结尾的字符串s和以j-1为结尾的字符串t的可构成t的情况有dp[i][j]种,如果有相对应的元素,即为s[i-1]=t[i-1],此时应有两种情况。前面的dp[i-1][j-1]是元素都匹配的情况,后面的dp[i-1][j]是模拟删除一种元素,即不匹配时计算s的前i-1个元素和 t 前 j 个元素。dp数组的含义为以i-1为结尾的字符串word1和以j-1为结尾的字符串word2使其两字符串相等的操作需要dp[i][j]步,共有三种情况。可以删除任意一个字符串中的一个字符。
2024-08-20 18:18:05 669
原创 算法日记day 42(动归之不相交的线|最大子数组和|判断子序列)
首先明确dp数组的含义,本题中dp数组含义为以 i 为尾的nums[i]最大子数组和为dp[i],定义初始结结果为第一个数的值,此后遍历数组,如果相加的值大于初始值,则更换为相加后的值,否则将初始值更替为当前遍历的值,因此递推关系式为。采用动态规划的思路解决,此时的dp数组的含义为以i-1为结尾的字符串s和以j-1为结尾的字符串t的子序列长度为dp[i][j],对于其中相同的元素,递推式为。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。可以画出两条不交叉的线,如上图所示。
2024-08-19 18:11:56 697
原创 算法日记day 41(动归之最长序列问题)
首先明确dp数组的含义,本题中dp数组含义是在结尾是nums[i]的最长递增子序列的长度为dp[i],由于dp数组由nums数组相照应,因此对dp数组中的所有元素均初始化为1,启用一个判断条件,若后者元素值大于前者,则结果值加一,因此dp数组的递归关系式为。首先明确dp数组的含义,本题中dp数组为对于长度为[0,i-1]的text1数组和长度为[0,j-1]的text2数组,他们的最长公共子序列为dp[i][j],对于对应元素值相同的情况,dp数组的递推式为。长度最长的公共子数组是 [3,2,1]。
2024-08-17 17:54:39 1125
原创 算法日记day 40(动归之买卖股票最佳时机(进阶版))
dp[i][3] 有两种情况,第一种是前一天已经第二次买入,今天未进行任何操作,即为dp[i-1][3],第二种是今天第二次买入,因此前一天是第一次卖出的状态 即为dp[i-1][2]-prices[i],两种情况取利润最大值。因此 dp[i][0] = max(dp[i-1][0],dp[i-1][1]-prices[i],dp[i-1][3]-prices[i]因此 dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i])
2024-08-16 18:20:29 835
原创 算法日记day 39(动归之打家劫舍)
本题为树形结构,采用后序遍历的方法,相邻节点之间不能同时拿取,在定义dp数组时分别有两种情况,分别是dp[0],代表在不拿当前节点的情况下所偷取的最大金额,dp[1]代表在拿当前节点的情况下所偷取的最大金额。偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。明确dp数组的含义,本题dp数组的含义为包含前 i 个元素(包含 i)所得的最大值为dp[i],分别有两种情况。你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。
2024-08-15 18:01:23 1010
原创 算法日记day 38(动归之零钱兑换|完全平方数|单词拆分)
首先明确dp数组的含义,本题含义是串长度为 i 的字符串在字典中出现的情况为dp[i]=true,初始化dp[0]=true,若在字符串s中有一区间{i,j}的dp均为true,说明该段的字符在字典中可查,为true。首先明确dp数组的含义,本题中dp数组的含义为在容量为 j 的背包中,可以装满背包所需要的最少物品为dp[j],初始化定义dp[0]=0,由于其需要取最小值,因此dp的非零变量全部初始化为int最大值,递推式为。不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
2024-08-14 17:04:34 852
原创 算法日记day 37(动归之零钱兑换2|组合问题4)
首先明确dp数组的含义,本题中dp数组的意思为,装满容量为 j 的背包有dp[j]种方法,在遍历时保证所有情况均已经被遍历到,因此有递推式。与零钱兑换2类似,但是零钱兑换所求得的是组合数,而本题求的是排列数,因此在代码上略有差别。请你计算并返回可以凑成总金额的硬币组合数。题目数据保证结果符合 32 位带符号整数。只用面额 2 的硬币不能凑成总金额 3。题目数据保证答案符合 32 位整数范围。请注意,顺序不同的序列被视作不同的组合。表示不同面额的硬币,另给一个整数。假设每一种面额的硬币有无限个。
2024-08-13 17:37:05 544
原创 算法日记day 36(动归之目标和|一和零)
要想求对应的target,则一定有一个做集合减去一个右集合所得,即为left-right=target,而left+right=sum,sum与target固定,则有 left-(sum-left)=target,因此left=(sum+target)/2,则我们只需要找到这个left的值即可说明存在方法使其最终达到目标和。最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4。最大的子集是 {"0", "1"} ,所以答案是 2。
2024-08-11 17:55:40 680
原创 算法日记day 35(动归之分割等和子集|最后一块石头的重量2)
题目:有一堆石头,用整数数组stones表示。其中stones[i]表示第i块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为x和y,且x <= y。如果x == y,那么两块石头都会被完全粉碎;如果x!= y,那么重量为x的石头将会完全粉碎,而重量为y的石头新重量为y-x。最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回0。示例 1:1组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],
2024-08-10 18:22:51 585
原创 算法日记day 34(动归之使用最小花费爬楼梯|不同路径2|整数拆分|不同的二叉搜索树)
题目:给你一个整数数组 ,其中 是从楼梯第 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 或下标为 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例 1:输入:cost = [10,15,20]输出:15解释:你将从下标为 1 的台阶开始。- 支付 15 ,向上爬两个台阶,到达楼梯顶部。总花费为 15 。示例 2:输入:cost = [1,100,1,1,1,100,1,1,100,1]输出:6解释:你将从下标为
2024-08-09 18:43:38 944
原创 算法日记day 33(动归之斐波那契数|爬楼梯)
要求每次可以爬1阶或者2阶,逆向思维可以理解为,当我们上到最后一阶楼梯时,可以迈一阶楼梯dp[n-1],或者迈两阶楼梯上dp[n-2],因此可得最终爬上去n阶台阶的方法共有dp[n-1]+dp[n-2]种方法,dp的方法是爬到第n阶台阶总共有多少种方法,而不是走了几步,因此递推关系仍是斐波那契数列。已知斐波那契数列递推式为dp[i]=dp[i-1]+dp[i-2],因此求第n个数只需要逐渐相加获得。1. 1 阶 + 1 阶 + 1 阶。1. 1 阶 + 1 阶。2. 1 阶 + 2 阶。
2024-08-08 18:21:02 437
原创 算法日记day 32(贪心之划分字母区间|合并区间|单调递增的数字|监控二叉树)
如何确立划分的一个片段有多少是关键,我们需要记录同一个字母的下标,在循环遍历字符串的过程中,每当相同的字母出现一次就更新成最新的位置,在遍历时如果找到最远出现下标的位置,说明找到了分割点,此时就属于一个片段,记录其长度至结果数组中,重复此操作,直到找到遍历完全部字符串。首先对全部区间的左边界从小到大排序,遍历的过程中比较该区间的左边界是否小于上一个区间的右边界 ,如果是,说明这两个区间有重合部分需要合并,合并时需取两区间左边界较小的值,右边界较大的值,然后存入结果数组中,最后输出结果数组。
2024-08-07 18:18:18 782
原创 算法日记day 31(贪心之根据身高重建队列|最少数量的箭引爆气球|无重复区间)
首先应对一个属性进行排序,我们先对身高进行从大到小排序,后得到一个新的数组,这时再看k,在身高相同的情况下,我们应对k降序排序,让值小的在数组前,这样才能满足题意,如(7,0)在(7,1)之前,身高h不同的情况下,按照k相对应的位置进行插入。[5,0][7,0][5,2][6,1][7,1] 同理,[5,2]h相同k越小排在前,k=2,因此排在当前数组下标为2的地方。因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。墙面上的气球记录在整数数组。
2024-08-06 18:35:08 611
原创 算法日记day 30(贪心之k次取反后最大化的数组和|加油站|分发糖果|柠檬水找零)
题目:给你一个整数数组 和一个整数 ,按以下方法修改该数组:重复这个过程恰好 次。可以多次选择同一个下标 。以这种方式修改数组后,返回数组 可能的最大和 。示例 1:输入:nums = [4,2,3], k = 1输出:5解释:选择下标 1 ,nums 变为 [4,-2,3] 。示例 2:输入:nums = [3,-1,0,2], k = 3输出:6解释:选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2] 。示例 3:输入:nums = [2,-3,-1,5
2024-08-05 19:06:58 708
原创 算法日记day 29(贪心之跳跃游戏)
判断是否可以从第一个元素到最后一个元素,其实只需要判断从第一个元素开始,它的大小即为其覆盖的范围,里面的元素均为可达的,然后跳至下一元素后继续判断其覆盖范围,重复上述操作,最后判断覆盖的范围是否是全数组的长度,如果是,说明是可达的,反之则不可达。与1不同的是,这次需要记录达到终点的跳跃最小数,判断覆盖范围如果小于数组长度,则需要继续跳跃,每往下跳跃一次则记录一次其覆盖范围,同时记录跳跃次数,如果跳跃到的元素其覆盖范围大于等于数组长度, 结束循环,输出最终跳跃次数。无论怎样,总会到达下标为 3 的位置。
2024-08-04 18:28:27 616
原创 算法日记day 28(贪心之分发饼干|摆动序列|最大子数组和|买卖股票最佳时机)
在判断是否摆动时,需要判断当前节点与左右邻节点的差值是否为一正一负,满足条件才是属于摆动,其中存在一种特殊情况,如:(1,2,2,4,5)属于单调摆动,这种情况总共只有2个摆动,即为边界的两次摆动,因此采用双指针摆动时不能实时更新两个指针的位置,应为一个指针负责判断差值,当差值存在时才能更新另一个指针的位置。可以采用双指针的方法,先将两数组从小到大排序,判断饼干数组中的值是否大于等于胃口数组的值,如果是结果加1,然后饼干数组向前遍历,继续判断,直到饼干数组全部遍历完毕,输出结果数组。,这个孩子会得到满足。
2024-08-03 18:54:56 665
原创 算法日记day 27(回溯之N皇后|解数独)
双层for循环分别遍历行和列,为了方便查找,在遍历第一行和列后如果没用满足的条件直接返回不在深入遍历,如果满足则继续遍历,当遍历完后如果没用返回则说明找到答案,其中应该判断行,列,3×3的九宫格中是否有重复的元素。主要在于处理逻辑,需要处理上下左右两方,还有斜45度和斜135度是否存在皇后,如果都不存在才可以将皇后放入对应的结果数组中,若存在则不能放入,继续判断下一个地区是否可行。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。如上图所示,4 皇后问题存在两个不同的解法。
2024-08-02 18:29:09 1055
原创 算法日记day 26(回溯之子集2|非递减子序列|全排列)
题目:给你一个整数数组 ,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。示例 1:输入:nums = [1,2,2]输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]示例 2:输入:nums = [0]输出:[[],[0]]思路:与之前的子集不同的是,这个集合中可能会存在重复元素的子集,因此需要进行去重操作,在树形结构中主要的去重在于树层的去重代码: 方法注释: 方法注释:
2024-08-01 18:32:17 630
原创 算法日记day 25(回溯之分割回文串|复原IP地址|子集)
关键在于如何判断ip地址是否合法,必须是1到9的数字,每段中不得超过255,且首部不能为0,每遇到一个合法地址必须在其后面加上相应的 '.' 表示分割,由于每种地址最多有3个 '.' 因此可以用一个计数,来判断分割是否完成且合法。确定是否为回文串,定义一个起始索引startIndex从当前索引开始遍历,满足回文条件存入数组中,然后继续递归调用下一层,直到遍历完毕后存入结果数组中并输出。在java中,substring方法用于从字符串中提取子串。,用以表示一个 IP 地址,返回所有可能的。
2024-07-31 18:28:13 625
原创 算法日记day 24(回溯之组合问题)
这里有两个限制条件,第一个只能找k个数,第二个这k个数相加必须等于n,因此我们可以在遍历一个数时同时存入一个数组中,同时计算他的和,如果等于n的值则返回所有数,这里需注意,有些情况并不需要进行判断,例如n=3的情况,这时我们遍历4之后的数字就将没有任何意义了,所以当遍历的值本身就大于n时就不需要再遍历了。首先需要定义一个字符串对应电话中每一个数字所对应的字母,用一个String类型的字符串保存所需的第几个数字所对应的字母,遍历当前字母,然后递归处理下一个数字,直到所有情况遍历完毕后,返回到一个结果数组中。
2024-07-30 19:44:01 1005
原创 算法日记day 23(有序数组转二叉搜索树|二叉搜索树转累加树|组合问题)
从题中不难得出,由于需要满足节点的新值大于等于当前节点的值之和,因此应该采用右、中、左的方式将节点的值逐渐累加最合适,定义一个计数器,采用双指针的方式不断记录前一个节点的值,另一个指针指向下一个节点,最终遍历完所有的节点。一个很简单的例子,如果n=4,k=4,那么在for循环遍历时,从2开始遍历就将没有任何意义的,这种的正是减少了不必要的循环遍历,提高了代码的执行效率。首先应根据下标找到数组中位于中间位置的元素作为构建平衡二叉搜索树的根节点,然后分别递归遍历该根节点的左数组和右数组作为其左子树和右子树。
2024-07-29 18:43:12 932
原创 算法日记day 22
5、节点的左右子树均不为空,这种情况最为复杂,当要删除的左右子树均存在时,可以将其左或者右节点作为其新的父节点添加到上面。当以右子树节点为新的父节点时,由于二叉搜索树的特性,右子树的值一定比左子树的值大,因此遍历寻找右子树中最左端的节点,然后将将要删去的节点的左子树全部放在该节点下,反之,如果以左子树节点为新的父节点,遍历该左子树最右端的子节点,然后将将要删去的节点的右子树节点全部放在该节点下,全部修改完毕后,删除指定节点,将其子节点返回给上一层,最后输出修改后的二叉搜索树。返回插入后二叉搜索树的根节点。
2024-07-27 19:44:17 330
原创 算法日记day 20(中序后序遍历序列构造二叉树|最大、合并、搜索二叉树)
首先在后序中确定最后一个节点为二叉树的根节点,再以此根节点在中序遍历中寻找左子树和右子树,和后序遍历中的左子树和右子树,依次循环递归其左右子树,直到遍历完所有节点为止。首先遍历数组中的最大值为根节点,后以该根节点为分割点区分开左右子树,然后分别对左右子树中的元素再进行如上操作,找到每次分割的左右子树中的最大元素作为下一层的父节点。- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。- 只有一个元素,所以子节点是一个值为 1 的节点。
2024-07-25 18:57:57 762
原创 算法日记day 19(找树左下角的值|路径总和)
题目:给定一个二叉树的 根节点 ,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。示例 1:输入: root = [2,1,3]输出: 1示例 2:输入: [1,2,3,4,null,5,6,null,null,7]输出: 7思路:该题的意思是要找到最深层的且最左端的节点,并不是找左节点, 因此容易理解错误。首先需要寻找其深度最大的叶子节点,可以采用递归的方式分别遍历其左右子树,最后输出其最深且最左端的叶子节点的值代码: 全局变量定义:findBottomL
2024-07-24 19:59:27 914
原创 算法日记day 18(二叉树的所有路径|左叶子之和)
采用前序遍历,递归和回溯法相辅相成, 用一个列表负责记录所走的路径,从根节点开始对每个节点依次遍历,直到遇到左右子节点均为空为止(即叶子节点),结束遍历,同时记录该条路径上所有的节点,并用"->"拼接。由于在遍历到叶子节点时并不清楚其是否为左叶子节点,因此在遍历时需要判断其父节点,如果其父节点有左子节点,且该左子节点是叶子节点,则将该左子节点的值加入最终结果,然后继续遍历下一个节点。在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。,返回所有从根节点到叶子节点的路径。
2024-07-23 16:31:21 697
原创 算法日记day 17(二叉树的最大、最小深度)
由于完全二叉树不存在只有右子树而没有左子树的情况,因此我们可以通过判断左右子树最左边的节点和最右边节点的深度差来判断该二叉树中节点的数量,这样很大一部分中间的节点就没必要再次遍历,时间复杂度自然就小于O(n)了。采用后序遍历的方法,一层一层的去判断子节点与父节点的距离,可以将一整个二叉树转变为一个个独立开来的二叉树,然后分别判断距离,在逐渐返回上一层,直到返回到根节点为止。的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。
2024-07-22 19:20:19 1187
原创 算法日记day 16(二叉树的广度优先遍历|反转、对称二叉树)
题目:给你二叉树的根节点 ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。示例 1:输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例 2:输入:root = [1]输出:[[1]]示例 3:输入:root = []输出:[]思路:用队列来存储元素,变量size来存储每一层的元素个数,扫描队头元素,判断其是否有左右孩子,如果有,将其入队,同时该队头元素出队,记录在该层所封装的结果集中,同时siz
2024-07-21 20:32:13 1090
原创 算法日记day 15(二叉树的遍历)
后序遍历与前序遍历大致相同,由于前序遍历的顺序是:中,左,右,而后序遍历的顺序是:左,右,中,我们只需要将前序遍历的顺序变为 (中,右,左) 即交换访问左右节点的顺序,然后将整个结果数组进行翻转,得到的结果即为后序遍历(左,右,中)与前序和后序遍历不同的是,由于中序遍历的顺序是左,中,右,在遍历第一个跟节点后,紧接着就是其按其左子树一层一层往下访问的最左端的左节点,因此不能像前后序遍历那样,因此在处理中序遍历时就需要借助指针来帮助访问节点,栈用来处理节点上的元素。前序遍历的顺序是:中,左,右。
2024-07-20 18:37:05 1173
原创 算法日记day 14(滑动窗口最大值)
采用大顶堆的方法,将滑动窗口所包含的值进行从大到小排序,最大的元素置于队列出口处,若新加入的元素大于入口处元素 ,则将入口的元素弹出,例如:窗口内元素为3,1 这时新加入的元素为2,2>1,因此弹出1,加入2,滑动窗口中的元素更新为3,2,保证队列队顶的元素始终为最大值。如果要添加的元素比队列末尾的元素大,就将末尾的元素弹出,直到满足单调递减的条件,然后将新元素加入队列末尾。遍历所有数中的元素出现的频率并记录,用小顶堆的方法,不断的去比较各元素出现的频率,始终保持堆中保存的是出现次数最大的那个元素。
2024-07-19 18:23:56 1019
原创 算法日记day 13(删除字符串中的所有重复元素)
初始化栈,将字符串中的元素分别加入栈中,每个元素加入栈时都与栈顶元素进行比较,如果相同则说明元素重复,栈顶元素弹出,继续遍历下一个元素,直到所有元素遍历完毕,此时栈中剩下的元素即为不重复的元素,但此时栈中元素的顺序与题目要求顺序相反,因此需要弹出栈中元素的同时赋给一个新的字符串。例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
2024-07-18 19:59:10 863
原创 算法日记day 11(KMP算法)
构建部分匹配表根据模式串,构建部分匹配表,计算每个位置对应的最长匹配前缀长度。匹配过程遍历文本串,同时根据部分匹配表调整模式串的位置,进行匹配。如果当前字符匹配成功,继续匹配下一个字符;如果匹配失败,根据部分匹配表移动模式串的位置,直到找到匹配或者完全匹配失败。KMP算法通过利用部分匹配表,避免了回溯,提高了模式串匹配的效率,特别适合于需要多次匹配模式串的场景,如字符串匹配、编辑距离计算等。
2024-07-16 19:29:08 665
原创 算法日记day 10(反转字符串)
重难点在于如何去处理空格的问题,既要保证单词的反转,也要保证每个单词之间只能保留有一个空格,其余的空格均需删除,因此需要有专门的删除空格的方法,采用双指针的方法去删除多余的空格,专门的反转单词的方法,需要先将整个字符串s整体反转,再分别对各个单词进行反转,因此需要完成两个反转方法。反转字符串中有很多细节上的问题,从整个字符串反转,再到分别划分区域的反转,这不仅仅需要对代码基本功足够扎实,同时还需要有较为缜密的逻辑,多花点时间去做去想,日积月累,一定可以有所收获!反转后的字符串中不能存在前导空格和尾随空格。
2024-07-15 17:07:20 744
原创 算法日记day 9(三数之和|四数之和)
与三数之和不同的是,该题需要实现a+b+c+d=target,但整体思路与三数之和雷同,因此需要实现许多地方的优化,即对代码进行剪枝操作,避免造成不必要的遍历而增加代码的执行时间。如果当前位置 i 对应的元素 nums[i] 大于 0,由于数组已经排序,说明后续元素都大于 0,不存在三数之和为 0 的情况,直接返回结果 result。总的来说,四数之和相较于三数之和在解题思路和复杂度上有一定的相似性,但也有明显的区别,特别是在处理结果去重和时间复杂度的控制上需要更多的考虑。
2024-07-14 18:13:58 573
原创 算法日记day 8(爬楼梯|四数相加)
题目:假设你正在爬楼梯。需要 阶你才能到达楼顶。每次你可以爬 或 个台阶。你有多少种不同的方法可以爬到楼顶呢?思路:采用动态规划的思想当n=1时,有一种方法当n=2时,有两种方法,即1和2当n=3时,有三种方法,即1+1+1,1+2,2+1当n=4时,有五种方法,即1+1+1+1,1+1+2,1+2+1,2+1+1,2+2.............由此可以总结出一个递推式,f(n) = f(n-1) + f(n-2)可以发现,爬楼梯问题演变成个斐波那契数列的问题,代码就很好写了具体分析:数组定义
2024-07-12 18:11:13 749
原创 算法日记day 7(不同路径和|两数之和)
这里需要用动态规划的方法思考,采用二维数组的方法,假设start位置为(0,0),二维数组为dp[m][n], 这里首先应该搞清楚,由于只能向右或向下移动,因此在第一行或者第一列移动时无论到什么位置,都只有一条路,因此可知 dp[0][n] 和 dp[m][0] 的值一定为1。dp[2][1] = dp[1][1] + dp[2][0],而dp[1][1]=2,因此dp[2][1]总共就为三种情况。dp[1][1]的条数等于dp[0][1]的条数加上dp[1][0]的条数,即1+1=2。
2024-07-11 17:45:53 1124
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人