- 博客(34)
- 收藏
- 关注
原创 代码随想录算法训练营第42天|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零
本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。本题物品的重量为stones[i],物品的价值也为stones[i]。对应着01背包里的物品重量weight[i]和 物品价值value[i]。494. 目标和 - 力扣(LeetCode)本题要如何使表达式结果为target,既然为target,那么就一定有 left组合 - right组合 = target。left + right = sum,而sum是固定的。right = sum - left公式来
2024-06-18 19:04:37
514
原创 代码随想录算法训练营第41天|● 01背包问题 二维 ● 01背包问题 一维● 416. 分割等和子集
首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图:当i为0时,即当选择物品0 时,当容量小于物品0的体积时,dp[0][j]=0,否则为value[0];4.确定遍历顺序在如下图中,可以看出,有两个遍历的维度:物品与背包重量本题都可以,先遍历物品在遍历背包较好理解。
2024-06-18 09:11:43
781
原创 代码随想录算法训练营第39天|● 62.不同路径 ●63. 不同路径 II
1.确定dp数组(dp table)以及下标的含义dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。2.确定递推公式3.dp数组的初始化先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理4.遍历顺序行列从前到后。
2024-06-17 20:54:48
351
原创 代码随想录算法训练营第38天|● 理论基础 ● 509. 斐波那契数● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯
2.确定递推公式dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。那么dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);3.dp数组初始化由题目可以知道你可以选择从下标为。
2024-06-17 20:27:16
938
原创 代码随想录算法训练营第37天|● 56.合并区间● 738.单调递增的数字
按照左边界从小到大排序之后,如果即intervals[i]的左边界 <= intervals[i - 1]的右边界,则一定有重叠。(本题相邻区间也算重贴,所以是<=)这么说有点抽象,看图:(判断左右区间如果没有重叠那么直接加入list否则更新右区间。
2024-06-13 19:59:52
532
原创 代码随想录算法训练营第36天|● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
此时大家就发现 情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。而情况三逻辑也不复杂甚至感觉纯模拟就可以了,其实情况三这里是有贪心的。账单是20的情况,为什么要优先消耗一个10和一个5呢?所以局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。
2024-06-12 15:29:03
399
原创 代码随想录算法训练营第35天|● 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果
本题首先想到尽可能将负的数变成正数,这样才能得到最大和,将数组进行按绝对值大小进行降序排序,若遇到负数将其取反后k--,若后面大于0 ,将用最小的数消耗掉k。
2024-06-12 12:24:34
383
原创 代码随想录算法训练营第32天|● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II
局部最优推出全局最优,找不出反例,试试贪心!
2024-06-12 10:17:39
402
原创 代码随想录算法训练营第31天|● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和
题目分类大纲如下:。。所以唯一的难点就是如何通过局部最优,推出整体最优。
2024-06-07 21:12:47
606
原创 代码随想录算法训练营第29天|* 491.递增子序列* 46.全排列* 47.全排列 II
思路分析:1.利用set管理已经取过的的数,防止重复2.判断list最后的数是否小于当前的nums[i]来控制递增序列。
2024-06-05 13:29:05
527
原创 代码随想录算法训练营第25天|● 216.组合总和III● 17.电话号码的字母组合
题目链接本题在组合问题中多加了一个总和为某个数的条件,在参数中加入sum求和,然后在收集结果是进行比较。
2024-06-02 13:09:01
437
原创 代码随想录算法训练营第23天|● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇
首先判断当前节点是否为空,若为空则返回null;然后判断当前节点的值是否小于low或大于high,分别对应着需要删除左子树或右子树的节点;最后更新当前节点的左子树和右子树,并返回修剪后的当前节点。
2024-05-30 21:06:57
409
原创 代码随想录算法训练营第22天|● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
然后判断根节点的值是否等于要删除的值,若相等则分四种情况处理:若该节点没有左右子节点,则直接返回null;若既有左子节点又有右子节点,则找到右子树中最小的节点,将其值替换要删除的节点的值,并删除右子树中最小的节点。若大于根节点的值,则递归地在右子树中删除该值。同理,函数会递归调用自身,将val插入到root.right(右子节点),并将更新后的右子树赋值回root.right。因此,函数会递归调用自身,将val插入到root.left(左子节点),并将更新后的左子树赋值回root.left。
2024-05-29 13:47:31
730
原创 代码随想录算法训练营第21天|● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。其实情况一 和 情况二 代码实现过程都是一样的,也可以说,实现情况一的逻辑,顺便包含了情况二。利用二叉搜索树的中序遍历的特性,将二叉树转成有序数组,进而求任意两个数的最小绝对差。
2024-05-28 13:25:59
297
原创 代码随想录算法训练营第20天|● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树
题目链接本题是构建二叉树,那么就是可利用前序遍历对二叉树进行遍历。递归3部曲1.返回类型:TreeNode 节点类型,参数 数组nums2.递归终条件:遇到叶子节点就直接返回3.单一递归逻辑:对左子树进行递归,对右子树进行递归。
2024-05-27 14:48:05
884
原创 代码随想录算法训练营第18天|● 513.找树左下角的值● 112. 路径总和 113.路径总和ii● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
题目链接思路:寻找左下角的值,即找到最后一层的第一个节点的值,利用层序遍历。
2024-05-27 10:04:10
407
原创 代码随想录算法训练营第17天|● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和
题目链接平衡二叉树:平衡二叉树也叫AVL树,它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和左子树的高度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。思路:计算高度确认前序遍历,首先判断左子树是否是平衡二叉树,然后判断右子树是否是平很二叉树,若不是直接按返回,最后判断是否为平衡二叉树。
2024-05-24 19:31:04
592
1
原创 代码随想录算法训练营第16天|● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
题目链接思路:刚刚学习了二叉树的层序遍历发现本题求的二叉树的深度其实也就是二叉树的层数代码递归法:递归三部曲1.确定递归函数的参数和返回值:参数是传入的根节点,返回值为二叉树的深度,类型为int2.确定终止条件:当root为空节点时退出3.确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。
2024-05-23 13:06:00
688
原创 代码随想录算法训练营第15天|● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2
文章链接二叉树的层序遍历需要借用一个辅助数据结构即队列来实现,题目链接。
2024-05-22 20:21:03
566
原创 代码随想录算法训练营第11天|● 20. 有效的括号● 1047. 删除字符串中的所有相邻重复项● 150. 逆波兰表达式求值
题目链接:20. 有效的括号 - 力扣(LeetCode)注意分好三种情况:1.左括号多余2.括号没有多余,但是匹配错误3.右括号多余如下动图所示:代码:删除字符串中的所有相邻重复项题目链接;1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)利用栈的特性实现相邻元素删除,遍历字符串,若栈空就直接入栈,否则判断当前字符是否与栈顶元素相等,如已经有相同字符那么直接出栈。最后栈中元素即为结果代码:优化:利用字符串来代替栈代码:逆波兰表达式求值题目链接:150. 逆波兰
2024-05-18 12:48:32
621
原创 代码随想录算法训练营第10天|● 理论基础● 232.用栈实现队列● 225. 用队列实现栈
思路:将队列的最后一个元素之前的元素,弹出并重新压入队列即可实现先进后出。利用两个栈实现队列,一个输入栈一个输出栈。利用一个队列完成队列模拟栈。队列的特点:先进先出。
2024-05-17 23:26:55
208
原创 代码随想录算法训练营第8天|● 344.反转字符串● 541. 反转字符串II● 卡码网:54.替换数字● 151.翻转字符串里的单词● 卡码网:55.右旋转字符串
题目链接视屏链接思路:利用双指针,一个在字符串头部,一个在字符串尾部,依次对指针指向的字符进行交换,然后移动指针。
2024-05-15 23:06:02
667
1
原创 代码随想录算法训练营第6天| ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 ● 总结
题目链接LeetCode_454视频链接学透哈希表,map使用有技巧!LeetCode:454.四数相加II思路:1.定义一个map存储数组A,数组B中两数和的数值以及出现的次数2.定义count储存答案3.遍历数组C和数组D的两束和,然后在map中去找 -(nums3[i]+nums4[j])4.如果可以找到,count+=对应的出现次数代码:赎金信题目链接:LeetCode_383思路:类似于 LeetCode_242同样用数组记录magazine中各个字符出现的次数,然后遍历ransomN
2024-05-14 22:00:50
1022
2
原创 代码随想录算法训练营第5天| ● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和
总结一下,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。
2024-05-13 20:07:41
733
1
原创 代码随想录算法训练营第4天| 24. 两两交换链表中的节点 , 19.删除链表的倒数第N个节点, 面试题 02.07. 链表相交 ,142.环形链表II ,总结
题目链接视频链接思路:利用虚拟头节点完成对节点交换的操作,需要先画图,确认间交换的步骤注意点:、1.确定temp指针为需要操作的指针的前一个位置2.若有奇数个节点,最后一个节点不需要操作所以退出遍历的条件为(temp.next.next!=null)若有偶数个节点就可以一一交换,退出遍历的条件为(temp.next!=null)所以遍历的判断条件为=null)3.因为后续操作会改变temp.next指向(如图节点1,同理节点3),要提前保存好。
2024-05-11 21:29:37
747
1
原创 代码随想录算法训练营第3天|链表理论基础 ,203.移除链表元素 ,707.设计链表 , 206.反转链表
链表是⼀种通过指针串联在⼀起的线性结构,每⼀个节点由两部分组成,⼀个是数据域⼀个是指针域 (存放指向下⼀个节点的指针),最后⼀个节点的指针域指向null(空指针的意思)。链表的⼊⼝节点称为链表的头结点也就是head。链表的常见类型:单链表单链表中的指针域只能指向节点的下⼀个节点。双链表每⼀个节点有两个指针域,⼀个指向下⼀个节点,⼀个指向上⼀个节点。双链表 既可以向前查询也可以向后查询。循环链表链表⾸尾相连。
2024-05-10 21:06:45
500
1
原创 代码随想录算法训练营第一天|数组基础 、704. 二分查找、27. 移除元素。
代码随想录算法训练营第一天|数组基础 、704. 二分查找、27. 移除元素。
2024-05-08 19:57:00
535
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人