自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 day60

每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序!// 第一个元素已经入栈,从下标1开始。这个可以加,可以不加,效果一样,思路不同。84.柱状图中最大的矩形。

2023-08-24 19:47:22 61

原创 day59

其实这一句可以不加,效果是一样的,但处理相同的情况的思路却变了。双指针解法:列遍历,左右最高柱子中取小的减去这一列柱子高度。// 记录每个柱子左边柱子最大高度。// 记录每个柱子右边柱子最大高度。思路与之前一样,就是将一样的数组拼接在后面。存着下标,计算的时候用下标对应的柱子高度。503.下一个更大元素II。注意减一,只求中间宽度。

2023-08-24 19:46:50 58

原创 day58

情况一:当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况。情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况。情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况。要找比自己大的元素,栈头到栈尾递增。496.下一个更大元素 I。与上一题区别主要在于。

2023-08-24 19:46:20 62

原创 day57

情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。当s[i]与s[j]不相等,dp[i][j]一定是false。

2023-08-23 22:27:25 52

原创 day56

dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。不同的字符取增、删、替换的最小;583. 两个字符串的删除操作。

2023-08-23 22:26:52 17

原创 day55

dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。如果最长公共子序列等于子串长度。最长公共子序列差不多。115.不同的子序列。

2023-08-23 22:26:03 17

原创 day53

dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]。1143.最长公共子序列。

2023-08-23 22:25:25 18

原创 DAY52

dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。dp[i]表示i之前包括i的以nums[i]只需要遍历一次 与上一个比较。取结果要遍历一遍取最大的,674. 最长连续递增序列。718. 最长重复子数组。300.最长递增子序列。的最长递增子序列的长度。

2023-08-23 22:24:27 29

原创 DAY51

状态二:保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期。或者是前一天就是卖出股票状态,一直没操作)状态一:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有)状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!不持有股票状态,这里就有两种卖出股票状态。714.买卖股票的最佳时机含手续费。309.最佳买卖股票时机含冷冻期。与Ⅱ不同就是卖出加上手续费。状态三:今天卖出股票。

2023-08-23 22:23:44 20

原创 day50

dp[i][j]表示第i天状态j所剩最大现金。没有操作 (其实我们也可以不设置这个状态)123.买卖股票的最佳时机III。188.买卖股票的最佳时机IV。

2023-08-16 22:21:14 17

原创 day49

买卖股票的最佳时机唯一不同的地方。贪心:最左最小值,取最右最大值,122.买卖股票的最佳时机II。dp[i][0] 表示第i天。dp[i][1] 表示第i天。121. 买卖股票的最佳时。

2023-08-16 22:20:28 13

原创 day48

如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,所以:val2 = max(left[0], left[1]) + max(right[0], right[1]);即:{不偷当前节点得到的最大金钱,偷当前节点得到的最大金钱}// 不偷cur,那么可以偷也可以不偷左右节点,则取较大的情况。下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]// 偷cur,那么就不能偷左右节点。// 长度为2的数组,0:不偷,1:偷。如果是偷当前节点,那么左右孩子就不能偷。

2023-08-16 22:19:53 18

原创 day46

dp[i] : 字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。本题是类似排列 因此需要 先遍历背包。起始位置,截取的个数。

2023-08-16 22:19:04 15

原创 DAY45

dp[j]:凑足总额为j所需钱币的最少个数为dp[j]那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。dp[j]:和为j的完全平方数的最少数量为dp[j]因此 先遍历背包,在遍历物品;完全背包&&排列形式;每次可以爬m阶以内;

2023-08-11 21:23:18 20

原创 DAY44

/ 先遍历物品,再遍历背包。// 先遍历背包,再遍历物品。377. 组合总和 Ⅳ。518.零钱兑换II。

2023-08-11 21:22:46 26

原创 DAY43

dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小。本题中strs 数组里的元素就是物品,每个物品都是一个!他含有的“0”,“1”就是他的两个维度重量。m 和 n相当于是一个背包,两个维度的背包。1049.最后一块石头的重量II。此时问题就转化为,装满容量为。(前面正号与负号的组合)装满背包有多少种方法。

2023-08-09 22:05:53 16

原创 daY42

套到本题,dp[j]表示 背包总容量(所能装的总重量)是j,放进物品后,背的最大重量为dp[j]背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值。背包如果正好装满,说明找到了总和为 sum / 2 的子集。只有确定了如下四点,才能把01背包问题套到本题上来。,求解将哪些物品装入背包里物品价值总和最大。背包中每一个元素是不可重复放入。件物品和一个最多能背重量为。背包的体积为sum / 2。416. 分割等和子集。

2023-08-08 22:11:01 21

原创 DAy41

我个人觉得dp【i】 = dp【j】*dp【i-j】的做法反而是更容易理解且正确的。dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量。元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量。元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量。96.不同的二叉搜索树。

2023-08-07 22:07:25 21

原创 DAY39

如果在起点或终点出现了障碍,直接返回。63. 不同路径 II。

2023-08-06 17:46:45 15

原创 DAY38

746. 使用最小花费爬楼梯。默认第一步都是不花费体力的。509. 斐波那契数。

2023-08-06 17:46:04 16

原创 DAY37

/ 设置为这个默认值,为了防止第二个for循环在flag没有被赋值的情况下执行。让strNum[i - 1]减一,strNum[i]赋值9,如果strNum[i - 1] > strNum[i]// flag用来标记赋值9从哪里开始。738.单调递增的数字。

2023-08-05 18:33:06 18

原创 DAY37

/ 合并区间,只更新右边界就好,因为result.back()的左边界一定是最小值,因为我们按照左边界排序的。从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点。// 第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并。第一个区间就可以放进结果集里,后面如果重叠,在result上直接合并。重叠 更新上一个数组右边界;统计每一个字符最后出现的位置。统计每一个字符最后出现的位置。开始,因为是记录重叠区间。找到字符出现的最远边界。

2023-08-05 18:32:11 15

原创 DAY35

创建新的数组,将排序完的people数组按k进行插入,因为后序插入的身高小的不会影响前面身高高的;局部最优:优先按身高高的people的k来插入。如果气球重叠了,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭。情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5。全局最优:最后都做完插入操作,整个队列满足题目队列属性。情况二:账单是10,消耗一个5,增加一个10。美元的找零用处更大,能多留着就多留着。情况一:账单是5,直接收下。将上一个气球的右边界更新为。将气球的左边界排序;

2023-08-05 18:31:15 17

原创 DAY34

为奇数,将最小正数取反;如果为偶数,不用管;从左向右遍历,大的孩子比前一个孩子糖果。从右向左遍历,大的孩子比前一个孩子糖果。1005.K次取反后最大化的数组和。取第一个可以累加和为正的下标;说明怎么走都不可能跑一圈了。将数组绝对值大到小排序;

2023-08-05 18:30:42 13

原创 DAY32

贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!画一个股票价格折线图,上升的区间即为我们需要收集的。更新当前覆盖最远距离下标(相当于加油了)当前覆盖最远距到达集合终点,不用做。局部最优:收集每天的正利润,更新下一步覆盖最远距离下标。遇到当前覆盖最远距离下标。全局最优:求得最大利润。下一步覆盖最远距离下标。说明可以覆盖到终点了。45.跳跃游戏 II。当前覆盖最远距离下标。

2023-08-04 12:12:55 13

原创 DAY31

分发饼干:我的思路遍历饼干大小,用最小的饼干满足最小的胃口;相当于重置最大子序起始位置,因为遇到负数一定是拉低总和。取区间累计的最大值(相当于不断确定最大子序终止位置)记录峰值个数,序列默认序列最右边有一个峰值。贪心算法(其实就是正常思维判断)注意这里,只在摆动变化的时候更新。注意这里,只在摆动变化的时候更新。情况一:上下坡中有平坡。情况三:单调坡中有平坡。情况二:数组首尾两端。

2023-08-04 12:12:13 9

原创 DAY29

/ used[i - 1] == false,说明同一树层nums[i - 1]使用过。// used[i - 1] == true,说明同一树枝nums[i - 1]使用过。// 如果同一树层nums[i - 1]使用过则直接跳过。数组来判断是否使用过此元素,与前面组合不同前面是树层去重,此时判断是否为。并且记录的数组不需要回溯,因为每一层定义新的数组记录。记录这个元素在本层用过了,本层后面不能再用了。排列可以取前面未使用过的元素;排列可以取前面未使用过的元素。里已经收录的元素,直接跳过。

2023-08-04 12:10:39 11

原创 DAY28

收集子集,要放在终止添加的上面,否则会漏掉自己。子集问题与前面组合问题最大差别是每一步都要收。判断第四段子字符串是否合法,如果合法就放进。与上面40.组合总和II的去重思路一样。插入逗点之后下一个子串的起始位置为。这个区间的子串是否合法。

2023-08-04 12:09:48 16

原创 DAY27

/ used[i - 1] == true,说明同一树枝candidates[i - 1]使用过// used[i - 1] == false,说明同一树层candidates[i - 1]使用过// 要对同一树层使用过的元素进行跳过。// 获取[startIndex,i]在s中的子串。// 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了。本题难点在于去重,建立一个数组存放元素是否使过;,每个数字在每个组合中只能使用一次。使用过的元素说明同一树枝可以;未使用过同一树层需要跳过;

2023-08-04 12:09:05 12 1

原创 DAY25

一下层要处理下一个数字了。17.电话号码的字母组合。216.组合总和III。取后面字符对应的字母;数字与字母数组映射;循环取出一个字母递归。

2023-08-04 12:08:29 10 1

原创 DAY24

第77题. 组合回溯利用树形结构;剪枝:至少从i处开始才能使数组满足要求i<=n - (k -pathsize()) +1voidintnintkintstartIndex) {ifpathsize() == k) {resultpush_back(path);return;forintpathsize()) +1;i++) {pathpush_back(i);(n,k,i+1pathpop_back。

2023-08-04 12:07:55 11 1

原创 DAY23

108.将有序数组转换为二叉搜索树。538.把二叉搜索树转换为累加树。669. 修剪二叉搜索树。接入符合条件的左孩子。接入符合条件的右孩子。

2023-08-04 12:07:07 10 1

原创 DAY22

第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点。第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点。判断向左还是向右,遇到空即是要插入的位置,定义新节点返回给上一层的左或右子树;第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点。节点保存一下,下面来删除。

2023-08-04 12:06:33 22 1

原创 DAY21

如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然。这里有的同学就理解不了了,为什么left为空,right不为空,目标节点通过right返回呢?如果left 和 right都不为空,说明此时root就是最近公共节点。利用二叉搜索树特性只需要遍历一遍二叉搜索树,就求出了众数的集合。利用map保存数值;530.二叉搜索树的最小绝对差。501.二叉搜索树中的众数。很关键的一步,不要忘记清空。如果和最大值相同,放进。与前一个节点数值相同。与前一个节点数值不同。

2023-08-04 12:04:02 19 1

原创 DAY20

/ 注意要小于等于,搜索树里不能有相同元素。// 最大值所在的下标右区间 构造右子树。:左中右遍历,将数值存数组中,判断数组是否有序。左子树小于父节点小于右子树。优化可以不用构建数组直接采用下标。直接在第一个二叉树上直接操作。700.二叉搜索树中的搜索。本题操作两个二叉树遍历。为空,合并之后就应该是。为空,合并之后就应该是。98.验证二叉搜索树。与前一个节点直接比较。与前一个节点直接比较。

2023-08-03 22:11:18 23

原创 DAY18

第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)// 依然左闭右开,注意这里使用了左中序数组大小作为切割点。// 第二步:后序遍历数组最后一个元素,就是当前的中间节点。// 第四步:切割中序数组,得到 中序左数组和中序右数组。// 第五步:切割后序数组,得到 后序左数组和后序右数组。第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点。// postorder 舍弃末尾元素。第五步:切割后序数组,切成后序左数组和后序右数组。// 第三步:找切割点。

2023-08-03 22:10:25 13

原创 DAY17

中,中为什么写在这里,因为最后一个节点也要加入到。// 这才到了叶子节点。回溯,收集完,向上返回弹出数值;前序遍历,先把节点数值记录;左右子树高度差是否大于一;257. 二叉树的所有路径。返回儿子层的左叶子节点的和。左子树就是一个左叶子的情况。

2023-08-03 22:09:08 15

原创 DAY16

/ 当一个左子树为空,右不为空,这时并不是最低点。// 当一个右子树为空,左不为空,这时并不是最低点。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。其实就是求高度,每一层返回根节点深度加一。是有目的的,为了下面求指数方便。222.完全二叉树的节点个数。104.二叉树的最大深度。111.二叉树的最小深度。

2023-08-03 22:07:30 11

原创 DAY15

/ 排除了空节点,再排除数值不相同的情况。,循环将其左右儿子加入他,同时将本身加入数组中。就是根节点的左子树与右子树是不是相互翻转。后序(儿子信息需要返回到父亲)利用队列 弹出到数组中保存。102.二叉树的层序遍历。开始,将元素加入队列。101. 对称二叉树。

2023-08-03 22:06:43 12

原创 DAY14

right,vec);left,vec);

2023-08-03 22:06:00 18

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除