- 博客(42)
- 收藏
- 关注
原创 【动态规划4】
链接: link这道题要求数组中有多少种加减组合,使得结果等于target,为了方便理解,先将组合拆分成A(元素前面只放加法)和B(元素前面只放减法)(注意:A和B两个集合里面的元素都是想加的),A+ B=sum,A- B = target,因为sum不变,target不变,所以B=sum-A,所以A-(sum-A)= target,A=(sum+target)/2,所以只需要求元素和为A有多少种即可。以前做的0-1题是求最大价值,现在求的是最多有多少种组合数,本质上是一样的。相似题型思路这道题吧m,
2025-04-02 13:11:03
245
原创 【动态规划3】
链接: linkdp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量。元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量。元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量。有2个元素的搜索树数量就是dp[2]。有1个元素的搜索树数量就是dp[1]。有0个元素的搜索树
2025-03-24 11:45:41
202
原创 【动态规划2】
链接: link机器人走路就只有两种方案,向右或向下动态规划5步曲:1.dp[i][j]含义是什么?2.dp数组初始化3.dp递推公式4.dp遍历顺序,根据3来判断5.举例63.不同路径Ⅱ链接: link和62题相似,但是注意在初始化的时候要注意添加限定条件343.整数拆分链接: link
2025-03-19 12:41:02
208
原创 【动态规划1】
链接: link这是一道经典的动态规划DP题,做动态有5步:1.确定dp[i]含义,表示第i个数的斐波那契数值是dp[i]2.dp数组初始化3.确定递推公式4.确定遍历顺序,从递推公式可以知道dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的5.举例推导,草稿完成70.爬楼梯链接link746.使用最小花费爬楼梯链接: link
2025-03-14 12:07:22
232
原创 【贪心算法5】
链接: link遇到c[i]>c[i+1]则c[i]–,然后就是给c[i+1]赋值‘9’;需要注意的是star初值问题,可见注释部分。相似题型思路设计初衷:叶子节点不放摄像头,让其父节点放三种状态0-无覆盖;1-有摄像头;2-有覆盖;注意考虑null节点的状态详细思路968.监控二叉树链接: link
2025-03-13 12:54:25
786
原创 【贪心算法4】
链接: link这道题的第一想法就是如果气球重叠得越多那么用箭越少,所以先将气球按照开始坐标从小到大排序,遇到有重叠的气球,在重叠区域右边界最小值之前的区域一定需要一支箭,这道题有两个地方容易出错:1.出现重叠区域,忘记更新最右边气球的有边界;2.在重叠区域内射箭,即在下面提供的代码中else里执行res++;这是我自己容易犯的错435.无重叠区间链接: link相似题型763.划分字母区间链接: link
2025-03-12 12:07:58
918
原创 【贪心算法3】
链接: link既然要求最大和,那么不妨先给数组排个序,如果有负数,先处理负数从前往后给数组取反,如果负数处理完后k还有次数,此时数组全是正数了,只需要对第一个元素取反即可,无非就是奇数次或者偶数次取反操作。最终求和即可。相似题型134.加油站链接: link135.分发糖果链接: link860.柠檬水找零链接: link406.根据身高重建队列链接: link
2025-03-11 11:54:44
455
原创 【贪心算法2】
链接: link要求最大利润,可以分解成子问题求解,在最低价格买入,最高价格卖出。假如第0天价格最低,第3天价格最高,利润=prices[3] - pricnes[0],可以将利润公式拆解成(prices[3]-prices[2])+(prices[2]-prices[1])+(prices[1]-prices[0])最终变成了求相邻两天的利润,所以可以得到一个关于利润的列表,只需要将这个列表大于0的相加即可求出最大利润相似题型思路上一道题是求利润最大化,而这道题是只能进行一次买卖,要求这一次
2025-03-07 15:15:42
351
原创 【贪心算法1】
链接: link尽可能让更多人吃到饼干并且尽可能少的造成浪费,大尺寸饼干能满足大胃口的人就应该优先分给大胃口的人。所以先将饼干和胃口大小排序,然后从后往前遍历。但是这时候又有一个问题,饼干和胃口哪个作为for循环哪个作为if呢?答案是只能胃口作为for,饼干作为if,因为for循环的i是固定每次移动,而饼干index只有满足条件才会移动。这里可以举一个反例,如果最大胃口大于最大的饼干,以饼干为for循环,胃口为if,那么for循环遍历下来,所有人都分不到饼干。376.摆动序列链接: link这道题看起代
2025-03-06 11:16:23
812
原创 【回溯算法6】
链接: link前面做过了组合、分割、子集的题,现在开始练习全排列问题,全排列要分顺序,不需要考虑剪枝问题,所以每次遍历从0索引开始直到叶子节点结束。47.全排列Ⅱ链接: link
2025-02-25 10:10:27
176
原创 【回溯算法5】
链接: link做这道题之前先体会一下上一期的第78题,这两道题区别就是集合里有重复元素了,而且求取的子集要去重。那么关于回溯算法中的去重问题,在前几期的40题有类似方法,添加一个used标记数组。相似题型这个递增子序列比较像是取有序的子集。而且本题也要求不能有相同的递增子序列。这又是子集,又是去重,是不是不由自主的想起了刚刚讲过的90题。90题是排序+标志位数组达到去重目的,而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。所以不能使用之前的去重逻辑!491.非递减子序
2025-02-24 14:00:26
240
原创 【回溯算法4】
链接: link判断递归回溯停止条件用分段数判断,当点数==3则表示分成了四段,最后不要忘记对第四段做一次有效性判断。相似题型78.子集如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始!链接: link
2025-02-21 11:08:56
188
原创 【回溯算法2】
链接: link这道题容易想到用嵌套的for循环实现,但是如果输入的数字变多,嵌套的for循环也会变长,所以暴力破解的方法不合适。可以定义一个map将数字和字母对应,这样就可以获得数字字母的映射了,递归中index参数理解成遍历过的第几个数字,也可以想成二叉树的深度,当index值等于digits长度时表示已经递归到叶子节点,要结束递归了。关于把回溯问题想成二叉树的思路,可以参照之前写的回溯1的思路思路这道题和回溯1出现的题有区别,但是思路相似,这道题可以出现重复的元素。所以递归下一层start参数
2025-02-19 11:21:08
457
原创 【二叉树学习9】
链接: link寻找数组分割点,然后分割点两边分别递归构造二叉树思路要算出节点值之和,必须访问所有大于该节点的值然后求和538.把二叉搜索树转换成累加树链接: link
2025-02-14 11:21:37
209
原创 【二叉树学习8】
链接: link先用中序遍历把BST结构保存在res中;然后再遍历一遍res,如果有key则删除,没有则return root;最后重构BST方法2:669.修剪二叉搜索树链接: link另如果题目不要求保持原来结构的话 这种方法更容易想到
2025-02-13 11:32:02
141
原创 【二叉树学习7】
链接: link要找p,q的公共祖先,可以从下往上遍历二叉树,而二叉树的后序遍历是天然的从下往上遍历。这题采用的是递归的方法,递归结束条件就是root为null或者root=p或者root=q就结束递归。然后说一下单层逻辑,当左右子树都不为空的时候,说明分别在左右子树找到了p和q,这个时候当前节点root就是最近的公共祖先;当左子树空、右子树不为空,则说明p,q出现在右子树,此时右子树的节点是最近的公共祖先;当左子树不为空、右子树为空同理;当左右子树都为空时,则说明二叉树中没有pq。235.二叉搜索树的
2025-02-12 12:24:01
321
原创 【二叉树学习6】
链接: link二叉搜索树是有序的,用中序遍历吧二叉搜索树转换成有序数组,然后找最小差。方法2:迭代501.二叉搜索树中的众数链接: link
2025-02-11 12:33:24
157
原创 【二叉树学习5】
链接: link相似题型617.合并二叉树链接: link700.二叉搜索树中的搜索链接: link98.验证二叉搜索树搜索二叉树的特点是:节点的左子树只包含小于当前节点的数节点的右子树枝包含大于当前节点的数所有左子树右子树必须满足二叉搜索树要判断二叉树是否是二叉搜索树,可以根据二叉搜索树的特点,用中序遍历,得到的结果一定是从小到大递增的数组。所以只需要验证二叉树的中序遍历结果是否递增。链接: link
2025-02-10 12:25:04
161
原创 【二叉树学习4】
链接: link节点A左孩子不为空,但左孩子的左右孩子为空,那么该节点为A的左叶子节点513.找树左下角的值链接: link112.路径总和链接: link113.路径总和2链接: link106.从中序与后序遍历序列构造二叉树链接: link105.从前序与中序遍历序列构造二叉树链接: link
2025-02-07 17:40:33
180
原创 【二叉树学习3】
链接: link卡哥思路,讲解很细致适合完全二叉树方法:110.平衡二叉树链接: link257.二叉树的所有路径链接: link
2025-01-21 12:50:27
213
原创 【二叉树学习2】
链接: link判断二叉树是否对称不是比较左右节点,而是比较根节点的左右子树是否对称,这道题只能通过后序遍历方式判断左右子树是否对称,因为要通过递归返回值判断两棵子树内侧外侧的节点是否相等相似题型100.相同的树递归的第一个条件必须这样写,因为当前节点都是null的话表示相等,并且在递归到最后一层叶子节点时,还要在执行一次递归比较,而叶子节点本身就是最后一层节点,他没有子节点,自然遇到null的时候需要返回true。链接: link572.另一棵树的子树利用100的方法求解链接: link
2025-01-16 11:22:03
119
原创 【二叉树学习】
链接: link想要将二叉树翻转一遍,只需要将每个节点的左右子节点互换位置即可。可以使用前后序递归,但是不建议用中序,因为可能导致某些子节点翻转2次。方法2:迭代589.N叉树的前序遍历链接: link590.N叉树的后序遍历链接: link
2025-01-15 11:09:57
125
原创 【二叉树的层序遍历】
链接: link相似题型107.二叉树层序遍历2链接: link199.二叉树右视图链接: link637.二叉树的层平均值链接: link429.N叉树的层序遍历链接: link515.在每个树行中找最大值链接: link116.填充每个节点的下一个右侧节点指针链接: link117.填充每个节点的下一个右侧节点指针2链接: link代码和116一样104.二叉树最大深度链接: link111.二叉树最小深度(递归)链接: link111.二叉树的最小深度(迭代)
2025-01-14 10:46:10
243
原创 【算法学习day15】
链接: link递归算法三要素:1.考虑输入参数、返回值;2.递归终止条件;3.单层递归逻辑;以二叉树前序遍历为例,考虑输入参数和返回值:递归终止条件:确定单层递归逻辑:方法:相似题型145.二叉树后序遍历链接: link94.二叉树中序遍历链接: link
2025-01-09 10:30:09
214
原创 【算法学习day14】
链接: link这道题是一道很好的双指针题,首先需要统计原字符串中数字出现次数,然后再去创建新的数组,数组空间为把数字替换成“number”后的长度大小。接着将字符串内容复制到新数组中利用双指针对新数组进行操作,这里为什么是从后向前操作呢?如果从前向后操作的话,时间复杂度会很复杂。i指针从数组最后位置开始,j指针指向数组中有内容的最后位置开始,然后开始遍历,如果是字母则赋值,如果是数字则替换。
2024-12-03 12:26:41
255
原创 【算法学习day13】
链接: link双指针求解力扣541.反转字符串2链接: link我觉得这道题巧妙的地方在于处理右指针以及对i的处理,有的同学第一眼可能会用计数器数2k然后再用一个计数器数k,其实不用,只需要控制i,让i每次加2*k就可以了,然后后面的逻辑就喝344题差不多了。
2024-11-29 19:09:55
142
原创 【算法学习day12】
链接: link这道题是在15题三数之和基础上进行的,同样难点在于剪枝处理和去重处理,关于这两部分考虑的思路我是直接参考卡神的思路,反正我是想不到。
2024-11-27 12:07:05
195
原创 【算法学习day11】
链接: link这道题用的方式很巧,我们首先用2个for循环遍历2个数组,将所有可能的和的到,然后存入map集合中,key为a+b,value为a+b出现的次数。接着再用2个for循环遍历剩余2个数组,用0去减两个数的和,再去map中找满足条件的结果,最后将所有结果相加即可。15.三数之和思路这道题要求是三元组不能相同,但是三元组里的元素可以相同。还有个难点就是关于去重的问题,a、b、c三个数分别如何去重等。这道题我自己想不到好的思路,直接放卡神的思路吧,感兴趣可以去看看,在分析是和前一个数比较
2024-11-26 21:07:41
627
原创 【算法学习day10】
链接: link这道题可能会遇到无限循环的情况,如何跳出循环是关键,我们可以用哈希表快速查询是否重复出现之前遇到的结果来结束循环。另外对数字的拆解也是解这道题的关键,下面来看题解吧。力扣1.两数之和这道题的思路解释是借鉴了卡神的思路这道题也是需要不断遍历数组,用两个for循环暴力求解就可以了,但是还有更好的办法就是使用哈希表。在用哈希表做这道题之前有四个问题:1.为什么会想到用哈希表?2.哈希表为什么用map?3.本题map用来存什么?4.map的key,value用来表示什么?关于上面的四
2024-11-13 20:29:50
802
原创 【算法学习day9】
链接: link这道题在原数组中有重复元素出现,可以用set集合来处理一次数组,然后再去用第二个数组和处理后的集合比较。使用set方法2:使用数组,有点类似day8的异位词相似题型350.两个数组的交集2链接: link
2024-11-06 20:18:45
299
原创 【算法学习day8】
链接: link可以初始化一个record数组,长度为26。然后统计s中字母出现的次数,因为26个字母是连续的,可以视‘a’字母的索引为0,’z’字母的索引为25。s中每遍历一个字母就在record中对应索引加1。接着统计t中字母出现次数,不同点在于每遍历一个字母就在record中对应索引减1。最后如果record全0则返回true否则返回false。相似题型383.赎金信这道题和242很相似,只需要判断最终record中是否有负数即可链接: link49.字母异位词分组链接: link这道题
2024-11-05 17:58:41
138
原创 【算法学习day7】
链接: link这道题求的是交点的两个指针相等,不是数值相等。在求解之前,需要对长的链表进行处理,将两个链表末尾对齐,然后移动长链表的指针和短链表指针位置对齐。142.环形链表这道题对于我来说比较难1.关于下面代码中为什么设置fast每次走2步,slow每次走1步;2.以及在有环的情况下为什么p1从相遇点开始走,p2从head开始走,这些疑惑都是借鉴了代码随想录的思路。链接: link
2024-11-04 19:43:23
158
原创 【算法学习day6】
链接: link这道题不是单纯的交换两个节点的值,而是节点之间的交换。这道题设置一个虚拟节点指向头节点head会比较容易,第一步:让虚拟节点指向第二个节点;第二步:第二个节点指向第一个节点;第三步:第一个节点指向第二个节点的后继;涉及到的变量有:1.虚拟节点2.第一个节点3.第二个节点4.临时节点,指向下一轮的第一个节点5.当前节点19.删除链表的倒数第N个节点链接: link
2024-11-01 16:53:24
211
原创 【算法学习day5】
链接: link单链表的删除、增加操作只需要注意如何修改指针即可,总体来说操作起来还是比较容易的。如果要删除某个节点,只需要将指向该节点的指针重新指向被删除节点的下一个节点即可。方法2:707.设计链表单链表链接: link双链表206.反转链表链接: link
2024-10-31 17:05:36
199
原创 【算法学习day4】
链接: link模拟顺时针画矩阵过程:1.填充上行从左到右2.填充右列从上到下3.填充下行从右到左4.填充左列从下到上从最外面一层一层向里面画圆填充处理每次层圈的时候会有边界问题,我们将上的最后一个交给右的第一次循环填充,将右的最后一个交给下的第一次循环填充,将下的最后一个交给左的第一次循环填充,左的最后一个已经被上第一次循环填充了,接下来进入第二层画圆相似题型54.螺旋矩阵链接: link
2024-10-30 17:13:48
512
原创 【算法学习day3】
链接: link使用滑动窗口解决这道题,使用滑动窗口会遇到以下几个问题:1.窗口内容是什么?2.如何移动窗口起始位置?3.如何移动窗口结束位置?不难看出:1.窗口内容就是和>=target的元素2.当窗口内容的和>=target就需要移动起始位置3.作为每次for循环遍历相似题型904.水果成篮链接: link这是一道求最长子串的问题,和第一道题相反。下面的代码是学习Benhao大佬的代码78.最小覆盖子串链接: link这道题参考大神的代码,创建四个变量,left、right、a
2024-10-28 19:56:37
326
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人