![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
文章平均质量分 67
是菜鸡小小陈啊
这个作者很懒,什么都没留下…
展开
-
算法记录 | Day60 单调栈
这道题和接雨水是呼应的,接雨水找的是两边第一个大于它高度的柱子,这道题是找两边第一个小于它高度的下标。这就导致在这题中单调栈的顺序是从大到小的。原创 2023-05-13 22:32:56 · 240 阅读 · 1 评论 -
算法记录 | Day59 单调栈
【代码】算法记录 | Day59 单调栈。原创 2023-05-12 13:25:59 · 415 阅读 · 0 评论 -
算法记录 | Day58 单调栈
思路:1.首先,将答案数组ans全部赋值为 0。然后遍历数组每个位置元素。2.如果栈为空,则将当前元素的下标入栈。3.如果栈不为空,且当前数字大于栈顶元素对应数字,则栈顶元素出栈,并计算下标差。4.此时当前元素就是栈顶元素的下一个更高值,将其下标差存入答案数组ans中保存起来,判断栈顶元素。5.直到当前数字小于或等于栈顶元素,则停止出栈,将当前元素下标入栈。6.最后输出答案数组ans。原创 2023-05-11 22:16:10 · 343 阅读 · 0 评论 -
算法记录 | Day57 动态规划
确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组。原创 2023-05-10 23:36:15 · 569 阅读 · 0 评论 -
算法记录 | Day56 动态规划
思路:dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数2.递推公式:3.初始化:从递推公式中,可以看出来,dp[i][0]和dp[0][j]是一定要初始化的。dp[i][0]:word2为空字符串,以i-1为结尾的字符串word1要删除多少个元素,才能和word2相同呢,很明显。。4.确定遍历顺序从递推公式和中可以看出dp[i][j]都是根据左上方和正上方推出来的。从上到下,从左到右5.举例推导dp数组。原创 2023-05-09 17:33:39 · 631 阅读 · 0 评论 -
算法记录 | Day55 动态规划
思路:dp[i][j]dp[i][j]。dp[i][j]3.dp数组如何初始化:从递推公式可以看出dp[i][j]都是依赖于和,所以dp[0][0]和dp[i][0]是一定要初始化的。4.遍历顺序同理从递推公式可以看出dp[i][j]都是依赖于和[j - 1],那么遍历顺序也应该是从上到下,从左到右如图所示:5.举例推导dp数组。原创 2023-05-08 22:28:49 · 368 阅读 · 0 评论 -
算法记录 | Day53 动态规划
思路:本题和区别在于这里不要求是连续的了,但要有相对顺序,即:“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。1.确定dp数组(dp table)以及下标的含义dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]2.确定dp数组(dp table)以及下标的含义dp[i][j]原创 2023-05-07 18:34:43 · 469 阅读 · 0 评论 -
算法记录 | Day52 动态规划
思路:1.dp[i]的定义:以 nums[i] 结尾的最长递增子序列长度。2.状态转移方程:位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。。3.初始化:每一个i,对应的dp[i](即最长递增子序列)起始大小至少都是14.遍历顺序:dp[i] 是有0到i-1各个位置的最长递增子序列 推导而来,那么遍历i一定是从。,那么是从前到后,还是从后到前遍历都无所谓,只要吧 0 到 i-1 的元素都遍历了就行了。所以默认习惯从前向后遍历。5.举例推导dp数组。原创 2023-05-05 21:06:42 · 362 阅读 · 0 评论 -
算法记录 | Day51 动态规划
思路:dp[i][j],表示为:第i天第j种情况()下,所获取的最大利润。在买入状态中,今日买入和之前买入的状态其实可以看做是股票的持有状态,可以将其合并为一种状态。在卖出状态中,昨天卖出和之前卖出的状态其实可以看做是无股票并度过了冷冻期状态,可以将其合并为一种状态。3.初始化:可以很明显看出第一天不做任何操作就是,第一次买入就是。第一次卖出的话,可以视作为没有盈利(当天买卖,价格没有变化),即。第二次买入的话,就是。同理第二次卖出就是。原创 2023-05-04 19:54:44 · 377 阅读 · 0 评论 -
算法记录 | Day50 动态规划
思路:1.确定dp数组以及下标的含义最多可完成两笔交易意味着总共有三种情况:买卖一次,买卖两次,不买卖。所以我们可以定义状态dp[i][j],表示为:第i天第j种情况()下,所获取的最大利润。2.确定递推公式3.dp数组如何初始化:第0天做第一次买入的操作,第一次卖出的话,可以视作为没有盈利(当天买卖,价格没有变化),即。第二次买入的话,就是。同理第二次卖出就是。4.确定遍历顺序从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。原创 2023-05-04 18:05:53 · 590 阅读 · 0 评论 -
算法记录 | Day49 动态规划
状态方程dpi0表示第i天交易完后,手上没有股票时的最大利润,dpi1表示第i天交易完后,手上持有股票时的最大利润。dpi0maxdpi−10dpi−11pricesi])dpi1maxdpi−11−pricesi])如果第i天不持有股票即dp[i] [0], 也可以由两个状态推出来。原创 2023-05-03 00:04:15 · 475 阅读 · 0 评论 -
算法记录 | 48 动态规划
思路:i间房屋的最后一个房子是nums[i−1]。如果房屋数大于等于 2 间,则偷窃第 i−1 间房屋的时候,就有两种状态:偷窃第 i−1 间房屋,那么第 i-2 间房屋就不能偷窃了,偷窃的最高金额为:前 i−2 间房屋的最高总金额 + 第 i−1 间房屋的金额,即 dp[i]=dp[i−2]+nums[i-1];不偷窃第 i−1 间房屋,那么第 i−2 间房屋可以偷窃,偷窃的最高金额为:前 i−1 间房屋的最高总金额,即 dp[i]=dp[i−1]。原创 2023-05-02 00:19:33 · 918 阅读 · 0 评论 -
算法记录 | Day46 动态规划
确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组。原创 2023-04-30 00:44:37 · 716 阅读 · 0 评论 -
算法记录 | Day45 动态规划
1阶,2阶,… m阶就是物品,楼顶就是背包。每一阶可以重复使用,例如跳了1阶,还可以继续跳1阶。问跳到楼顶有几种方法其实就是问装满背包有几种方法。1.确定dp数组以及下标的含义:dp[i]:爬到有i个台阶的楼顶,有dp[i]种方法。2.确定递推公式:dp[i] += dp[i - j]dp[i]有几种来源,dp[i - 1],dp[i - 2],dp[i - 3] 等等,即:dp[i - j]3.dp数组如何初始化:dp[0]=1。原创 2023-04-29 00:29:57 · 774 阅读 · 0 评论 -
算法记录 | Day44 动态规划
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。,求解将哪些物品装入背包里物品价值总和最大。。完全背包的物品是可以添加多次的,所以要从小到大去遍历。原创 2023-04-28 00:02:56 · 468 阅读 · 0 评论 -
算法记录 | Day43 动态规划
思路:本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,。本题物品的重量为stones[i],物品的价值也为stones[i]。对应着01背包里的物品重量weight[i]和 物品价值value[i]。1.确定dp数组以及下标的含义:dp[j]将石头放入载重上限为 j 的背包中可以获得的最大价值。3.dp数组如何初始化:01背包,一维dp初始化,dp[0] =0。原创 2023-04-26 23:24:13 · 386 阅读 · 0 评论 -
算法记录 | Day42 动态规划
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。,求解将哪些物品装入背包里物品价值总和最大。**0-1 背包问题的特点:**每种物品有且仅有 1 件,可以选择不放入背包,也可以选择放入背包。原创 2023-04-25 23:21:06 · 318 阅读 · 0 评论 -
算法训练 | Day41动态规划
思路:确定dp数组(dp table)以及下标的含义:dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。确定递推公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j))可以想 dp[i]最大乘积是怎么得到的呢?其实可以从1遍历j,然后有两种渠道得到dp[i].一个是j * (i - j) 直接相乘。一个是j * dp[i - j],相当于是拆分(i - j)。dp数组如何初始化:dp[0] dp[1] 不应该初始化,没有意义的数值。原创 2023-04-24 22:37:42 · 412 阅读 · 0 评论 -
算法记录 | Day39 动态规划
【代码】算法记录 | Day39 动态规划。原创 2023-04-23 00:45:02 · 48 阅读 · 0 评论 -
算法记录 | Day38 动态规划
还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。dp[i - 1],到上i-1层楼梯,花费dp[i - 1],i-1到i花费dp[i - 1]+cost[i-1]首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。dp[i - 2],上i-2层楼梯,花费dp[i - 2],i-2到i花费dp[i - 2]+cost[i-2]dp[i] 可以有两个方向推出来。原创 2023-04-21 23:05:51 · 449 阅读 · 0 评论 -
算法记录 | Day37 贪心算法
思路:1.一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。2.向后遍历从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。原创 2023-04-21 00:10:51 · 1760 阅读 · 0 评论 -
算法记录 | Day36 贪心算法
按照x[0]排序按x[1]排序。原创 2023-04-19 21:36:27 · 45 阅读 · 0 评论 -
算法记录 | Day35 贪心算法
思路:只需要维护三种金额的数量,5,10和20。账单是20的情况,优先消耗一个10和一个5所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。原创 2023-04-18 20:58:56 · 429 阅读 · 0 评论 -
算法记录 | Day34 贪心算法
这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,先确定右边评分大于左边的情况(也就是从前向后遍历)再确定左孩子大于右孩子的情况(从后向前遍历),原创 2023-04-17 21:38:19 · 590 阅读 · 0 评论 -
算法记录 | Day32 贪心算法
思路:把利润分解为每天为单位的维度,而不是从0天到第3天整体去考虑!那么根据prices可以得到每天的利润序列:(prices[i] - prices[i - 1])…(prices[1] - prices[0])。如图:从图中可以发现,其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。那么只收集正利润就是贪心所贪的地方!局部最优:收集每天的正利润,全局最优:求得最大利润。动态规划状态定义状态表示:状态方程={dp[i][0]=表原创 2023-04-16 01:15:05 · 723 阅读 · 0 评论 -
算法记录 | Day31 贪心算法
优先满足大胃口优先满足小胃口。原创 2023-04-15 02:29:42 · 57 阅读 · 0 评论 -
算法记录 | Day30 回溯算法
思路:1.确定回溯函数参数:定义全局遍历存放path,原创 2023-04-13 22:37:12 · 649 阅读 · 0 评论 -
算法记录 | Day29 回溯算法
思路:1.确定回溯函数参数:定义全局遍历存放res集合和单个path,还需要2.终止条件:当startindex >len(nums),return;如果len(path) >= 2,则将当前递增子序列添加到 res 数组中(注意:不用返回,因为还要继续向下查找)3.遍历过程:去重,for循环层(树层)不能使用相同元素。原创 2023-04-12 22:29:57 · 362 阅读 · 0 评论 -
算法记录 | Day28 回溯算法
思路:1.确定回溯函数参数:定义全局遍历存放res集合和单个path,还需要s字符startindex(int)为下一层for循环搜索的起始位置。2.终止条件:当len(path)==4且遍历到字符串最末尾,将path加入res,len(path)>4 return3.遍历过程:取temp= s[startindex:i+1],判断是否合法。原创 2023-04-11 20:19:00 · 359 阅读 · 0 评论 -
算法记录 | Day27 回溯算法
思路:1.确定回溯函数参数:定义全局遍历存放res集合和单个path,还需要candidates数组targetSum(int)目标和。startIndex(int)为下一层for循环搜索的起始位置。3.遍历过程:数组可以重复,startindex从i开始。原创 2023-04-10 23:00:40 · 513 阅读 · 0 评论 -
算法记录 | Day25 回溯算法
本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,…,9]。本题k相当于树的深度,9(因为整个集合就是9个数)就是树的宽度。思路:1.确定回溯函数参数:定义全局遍历存放res集合和单个path,还需要2.终止条件:len(path) == k and sum(path) == n,结束3.遍历过程:本题和区别之一就是集合固定的就是9个数[1,…,9],所以for循环固定i<=9。原创 2023-04-09 00:48:03 · 36 阅读 · 0 评论 -
算法记录 | Day24 回溯算法
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯算法解决的问题都可以抽象为树形结构(N叉树),用树形结构来理解回溯会容易很多。原创 2023-04-08 01:11:14 · 34 阅读 · 0 评论 -
算法记录 | Day23 二叉树
思路:1.确定递归参数和返回值:输入root、low、high2.终止条件:修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。原创 2023-04-06 23:36:42 · 23 阅读 · 0 评论 -
算法记录 | Day22 二叉树
思路:1.确定递归函数参数以及返回值:输入root、q、p,输出最近公共祖先2.确定终止条件:节点为空,返回3.确定单层递归的逻辑:如果当前节点的值大于pq的值,说明p和q应该在当前节点的左子树,因此将当前节点移动到它的左子节点,继续遍历;如果当前节点的值小于pq的值,说明p和q应该在当前节点的右子树,因此将当前节点移动到它的右子节点,继续遍历;如果当前节点不满足上面两种情况,则说明p和q分别在当前节点的左右子树上,则当前节点就是分岔点,直接返回该节点即可。原创 2023-04-06 00:03:22 · 23 阅读 · 0 评论 -
算法记录 | Day21 二叉树
二叉树的中序遍历顺序是:左 -> 根 -> 右,二叉搜索树的中序遍历最终得到就是一个升序数组,升序数组中绝对值差的最小值就是比较相邻两节点差值的绝对值思路:1.先进行中序遍历变成有序数组2.计算相邻的插值简化:1.ans用于存储差的绝对值的最小值2.pre用于保存上一节点的值,用于和当前节点计算差值的绝对值。原创 2023-04-04 21:25:35 · 37 阅读 · 0 评论 -
算法记录 | Day20 二叉树
思路:构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。1.找到nums中 最大值及其索引,创建根节点2.分割数组3.递归左右子树。原创 2023-04-03 22:49:26 · 30 阅读 · 0 评论 -
算法记录 | Day18 二叉树
思路:深度最大的叶子节点一定是最后一行。1.确定递归参数和返回值:输入root,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值2.终止条件:遇到左右子树均为空,更新最大深度。原创 2023-04-01 22:48:03 · 34 阅读 · 0 评论 -
算法记录 | Day17 二叉树
思路:1.确定递归参数和返回值:输入root,输出高度或是否平衡2.终止条件:遇到None,return 03.单层逻辑:左边高度,右边高度,中间 =1+max(左高,右高)原创 2023-04-01 00:19:52 · 29 阅读 · 0 评论 -
算法记录 | Day16 二叉树
深度:从上往下看高度:从下往上看,从下往上计数。原创 2023-03-31 00:06:51 · 30 阅读 · 0 评论 -
算法记录 | Day15 二叉树
层序遍历:层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树通过队列来实现的。具体步骤如下:判断二叉树是否为空,为空则直接返回。令根节点入队。当队列不为空时,求出当前队列长度 s。依次从队列中取出这 s 个元素,并对这 s个元素依次进行访问。然后将其左右孩子节点入队,然后继续遍历下一层节点。当队列为空时,结束遍历。原创 2023-03-29 21:27:15 · 41 阅读 · 0 评论