- 博客(25)
- 收藏
- 关注
原创 代码随想录算法训练营第三十五天|卡玛网46.0-1背包问题(一维和二维),416.分割等和子集。
依然动归五部曲。1.确定dp数组及其下标含义:使用二维数组,dp[i][j],为什么要用二维,因为物品和背包容量都需要表示,i表示物品、j表示背包容量。dp[i][j]代表。具体情况举例看代码随想录网站上:代码随想录代码随想录PDF,代码随想录网站,代码随想录百度网盘,代码随想录知识星球,代码随想录八股文PDF,代码随想录刷题路线,代码随想录知识星球八股文2.确定递推公式:举例,比如dp[1][4]有两种情况,放物品1还是不放物品1。
2024-12-18 21:41:46
203
原创 代码随想录算法训练营第三十四天|62.不同路径、63.不同路径ii。
动归五部曲:确定dp数组及其下标含义,确定递推公式,dp数组如何初始化,确定遍历顺序,举例推导dp数组。1.确定dp数组及其下标含义:dp[i][j]表示从(0,0)开始,到(i,j)有 dp[i][j] 条不同的路径。2.确定递推公式:这个路径,比如此时在(i,j),那么他只能从他的左边或者上边走来,因为题目中说了是从左上角到右下角,所以是从(i-1,j)和(i,j-1)两个方向走来,所以dp[i][j] = dp[i-1][j] + dp[i][j-1]。
2024-12-18 13:11:40
571
原创 代码随想录算法训练营第三十二天|509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼
最近家里有事,前面几天后面给补上,动规是由前一个状态推导出来的,而贪心是局部直接选最优的。
2024-12-17 21:16:34
362
原创 代码随想录算法训练营第二十八天|122.买卖股票的最佳时机ii、55.跳跃游戏、45.跳跃游戏ii、1005.K次取反后最大化的数组和。
看代码中的注释,贪心算法没有什么规律。
2024-12-10 16:10:59
217
原创 代码随想录算法训练营第二十七天|455.分发饼干、376.摆动序列、53.最大子序和。
小饼干先喂饱小胃口和大饼干喂饱大胃口,都可以,for循环遍历孩子,Index控制饼干。
2024-12-09 15:06:49
229
原创 代码随想录算法训练营第二十五天|491.递增子序列、46.全排列、47。全排列ii。
1.递归传参:多加一个startIndex来控制每次递归起始位置即可。2.终止条件:其实可以不加终止条件,因为startIndex每次都会+1,不会无线递归,但是题目要求子序列大小至少为2,所以size > 2就行。3.单层搜索逻辑:如下图,同一父节点下的同层上的元素使用过就不能再使用了。这里要注意,为什么这个set没有remove操作,因为每层递归都会新建一个新的set,每层用的不是同一个set!!!
2024-12-08 22:24:10
731
原创 代码随想录算法训练营第二十四天|93.复原IP地址、78.子集、90.子集ii
1.递归函数的传参:题目给的s,表示点的数量的int PointNum(判断IP地址是否写完看他够不够三个点),记录搜索起始位置的startIndex。2.终止条件:用点数PointNum == 3来结束,因为一个IP地址内有三个点就表示这个IP地址写完了。3.单层搜索逻辑:判断单个子串是否合法,不合法就跳过本层循环,合法就在后面加上“ . ”。
2024-12-06 17:48:40
565
原创 代码随想录算法训练营第二十三天|39.组合总和、40.组合总和ii、131.分割回文串。
1.递归函数传参和返回值:一样是和之前回溯题一样的两个数组result和path,然后是题目中给的candidates,target,然后需要一个计算总和的sum和一个控制for循环的startIndex。2.终止条件:sum > target或者sum == target,等于时候需要收集结果。3.单层递归逻辑,每层循环从startIndex开始,搜索candidates集合。本题和之前做的组合问题不同的是,这题的元素是可以重复选取的,如何控制他可以重复选取?
2024-12-05 16:37:43
634
原创 代码随想录算法训练营第二十一天|669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树。
1.递归传参和返回值:传入要处理的二叉搜索树根节点,返回修建完的二叉树。2.终止条件:root == null3.单层递归逻辑:如果root(当前节点)的val小于low,就应该递归右子树,如果大于high,就应该递归左子树。这样看,是有点懵逼的,这是怎么把“不符合要求”的节点移除的?
2024-12-03 11:39:48
583
原创 代码随想录算法训练营第二十天|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点。
1.递归的传参和返回值:传入根节点,p,q。返回p和q的最近公共祖先。2.终止条件:root == null。3.单层递归逻辑:寻找区间[p.val,q.val],如果cur.val都比这俩大,说明应该往左遍历了,同理小了就往右。最近公共祖先就是在这个区间内的节点,简单来说这题就是找这个区间内的节点。
2024-12-02 15:32:20
749
原创 代码随想录算法训练营第十八天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先。
数字代表leetcode中的题号。
2024-11-30 17:16:46
691
原创 代码随想录算法训练营第十七天|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树。
1.递归的传参和返回值:传入存放元素的数组,返回根据该数组构造的头结点2.终止条件:数组大小为1的时候,说明到达了叶子节点,返回这个节点。3.单层递归逻辑:(1)找到最大值和对应下标,最大值来构造节点,下标来分割数组。(2)最大值所在的下标左区间,构造左子树。(3)最大值所在的下标右区间,构造右子树。
2024-11-29 17:16:42
762
原创 代码随想录算法训练营第十六天|513.找树左下角的值、112.路径总和、113.路径总和ii、106.从后序与中序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树。
1.递归的参数和返回值:传入根节点,当前深度。返回void,利用两个全局变量maxDepth和result,分别是最大深度和最终返回值(左下角的值)。2.终止条件:遇到叶子结点,统计一下最大深度,或者说更新一下最大深度。3.单层递归逻辑:就是找最大深度,需要回溯。在遍历过程中,在遍历时只比较深度,并且优先遍历左子树,所以记录的是同一深度中最左边的值。
2024-11-28 15:21:34
693
原创 代码随想录算法训练营第十五天|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数。
写递归时候注意的三个东西,第一个就是传入的参数和返回值,第二个是递归的终止条件,第三个是单层递归的逻辑。我们分别来看,第一个传入的参数和返回值就是二叉树的节点、返回该节点的高度,第二个终止条件就是node == null,当前节点为空,第三个单层递归的逻辑就是判断该节点左右子树的差值是否大于1,大于1就不是平衡二叉树。本体还有一个核心的思路就是用-1去标识这个“节点”他是否是“平衡二叉树”,只是一个标记,最后判断时候就看这个高度是不是-1,哪怕是0也算平衡二叉树。
2024-11-27 17:09:07
664
原创 代码随想录算法训练营第十四天|226.翻转二叉树、101.对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度。
直接上代码,个人感觉递归比迭代法好理解很多。
2024-11-26 19:32:37
286
原创 代码随想录算法训练营第十天|232.用栈实现队列、225.用队列实现栈、20.有效的括号、1047.删除字符串中所有相邻重复项
这里有一个问题,比如说,in是123,dumpstackIn之后In是空的,此时out是321,此时去pop是没问题的,弹出1,2,3,但是如果此时In又来了45,那么此时经过dumpstackIn之后out就是32154,此时模拟的功能就会出问题,所以我们要对dumstackIn的功能做个限制,只有在out为空时才可以去执行,这就避免了上述情况。
2024-11-22 16:15:18
765
原创 代码随想录算法训练营第九天|151.翻转字符串里的单词、卡玛网55.右旋转字符串、28.实现strStr()、459.重复的子字符串
整体思路就是把整个字符串反转,然后利用空格作为间隙,去单独翻转每一个单词。还有就是开头处理一下字符串,去掉开头和末尾的空格,以及长度大于1的空格,这里偷懒用的trim和replaceAll。
2024-11-21 14:09:37
417
原创 代码随想录算法训练营第八天|344.反转字符串、541.反转字符串||、卡玛网54.替换数字
344和541来自leetcode,54来自卡玛网。
2024-11-20 19:09:00
858
原创 代码随想录算法训练营第七天|454.四数相加||、383.赎金信、15.三数之和、18.四数之和
这题很容易陷入一个误区,我自己就是,就是过度在意数组的下标,到底是第几个元素加起来等于0,但是题目要求的是“次数”,所以我们不用关心他到底是哪几个元素加起来等于0的,只要关心满足条件的次数有几次即可。理解完这题就很简单了,利用map来做哈希表,key是不同数组之间元素加起来的和,value代表出现次数。我们的大体思路是:先求出nums1和nums2中所有的可能,然后放到map中,接着去遍历剩下两个数组,找出我们“需要”的元素,也就是0-(前两个数组和)。
2024-11-19 16:40:15
1237
原创 代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表||
然后我们明确一下要用到的变量,这题就很简单了:两个要交换的元素分别用firstNode和secondNode来表示,temp来表示这两个元素的下一个节点,cur来表示两个元素的前一个节点。我们交换时的赋值都通过cur来完成,这就是cur存在的意义。交换完直接让他等于两个元素中的第二个就行了,因为这个第二个就是下一对要交换元素的“前一个节点”。
2024-11-17 20:06:39
540
原创 代码随想录算法训练营第三天|203.移除链表元素、707.设计链表、206.反转链表
基本思路就是很简单的判断,下一个节点的值等于val就把当前节点指向后面第二个节点就行了。主要注意的是开头的while循环,while(head!
2024-11-15 16:07:00
337
原创 代码随想录算法训练营第二天|209.长度最小的子数组、59.螺旋矩阵、区间和、开发商购买土地
带题号的见leetcode,后面两个链接:区间和:58. 区间和 | 代码随想录开发商购买土地:44. 开发商购买土地 | 代码随想录这题首先要理解为什么要用滑动窗口,题目要求的是这个子数组是“连续的“,滑动窗口正好符合这个条件,在数组中一直”滑动”着走,这个“滑动窗口”是连续的。这题如果用两层for循环暴力搜会超时,所以要用一个for循环去达到两个for循环的效果:for (int right = 0; right < nums.length; right++)这里讲一下为什么要用for中的
2024-11-14 14:58:34
654
原创 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素、977.有序数组的平方。
主要注意边界问题,进入while循环时候的left == right,以及下面判断时候,left = mid -1和right = mid + 1,这两个看图可以很快理解。特殊说一下int mid = left + ((right - left) >> 1);这样写可以防止溢出,也就是防止超出int类型的范围,>> 1 是无符号右移,在二进制中也就是除2。
2024-11-13 15:18:34
452
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅