自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 动态规划背包

核心在于背包遍历顺序上,背包遍历顺序决定了状态转移到何种状态,顺序遍历转移到当前物品的小背包,倒序遍历 转移到前一个物品的小背包。而具体dp的含义在刷题时积累。只用检查0号物品的dp是否算对就行,他是继承的状态转移的基础,继承也是一种状态转移。一般0号物品是靠替换阶段进行有意义赋值的(自力更生),在组合数量里背包正好是j=coins[i]时发生第一次替换。会把状态转移到dp[0]。

2023-11-19 22:50:44 27

原创 Day|37|1971. 寻找图中是否存在路径,684.冗余连接,685.冗余连接II

并查集处理图里存在冗余边(闭环边)的问题,冗余边的两个节点存在公共根节点。由于在任意一个图里每个节点的入度至少是1,只有冗余连接会造成节点的入度大于1,所以还可以用先计算节点的入度再利用入度找出可疑的冗余边。利用edge【i】来遍历每条边,并查集处理每条边的两个节点。

2023-10-29 17:27:56 43

原创 Day36|463. 岛屿的周长

遍历每个岛屿,再遍历每个岛屿周围情况,以计算面积。

2023-10-28 10:52:19 36

原创 Day35|841.钥匙和房间

深度上每一层的数据池需要提取再交给下一层,下一层的数据池被上一层数据池中被选择的数决定,画数据池的图结构。

2023-10-28 00:06:01 32

原创 Day34|827.最大人工岛,

另一种通过前序累加求面积,原理也是遍历的节点数和函数个数一样。一种通过回溯累加求面积,原理遍历的节点数和函数个数一样。

2023-10-27 00:12:33 18

原创 Day33|1020. 飞地的数量,130. 被围绕的区域,417. 太平洋大西洋水流问题

把边界上的岛屿标记成A,内部岛屿标记成O,先把内部岛屿标记成X,再把A岛屿恢复成O。for横向如果用return结束会导致整个横向终结,出现少遍历的情况,手动输入横向,只需在dfs内部检验参数合法性即可。用for循环写横向需要先行检验参数合法性,手动横向,不好在上下层参数之间作比较,比如。两种方式其实熟练起来for横向更简单?先淹掉例外情况,再dfs统计。

2023-10-26 01:06:39 21

原创 Day32|797.所有可能的路径,200. 岛屿数量,695. 岛屿的最大面积

在你的代码中,你尝试计算一个二维网格中岛屿的最大面积。你使用深度优先搜索(DFS)来遍历每个陆地单元格,并在过程中计算岛屿的面积。先深入到最后一层,有四种可能,4(n)*4(n-1)*4(n-2)*...*4(1)回溯到第一层的4种可能,共遍历4^n个节点。用continue在横向4种可能上进行剪枝,判断当前节点是否为‘1’和false其实也是横向选取,当横向都不满足时就纵向回溯。变量并不会在递归中正确地累积岛屿的面积,因为 Java 中的参数传递是按值传递的,这意味着。作为参数传递,因为你已经在。

2023-10-24 21:28:06 14

原创 Day31|455.分发饼干,376. 摆动序列,53. 最大子序和

制约人数的是最大胃口的小孩,优先解决胃口大的小孩,既可以使可满足的人数最多又可以使饼干充分利用,优先解决胃口小的小孩需要把饼干做筛选非常麻烦。

2023-10-23 22:50:50 45

原创 Day29|332.重新安排行程,51. N皇后,37. 解数独

对递归的理解又深入了:不管是二叉树的左右节点遍历还是回溯算法槽位选择数据池,都可以看成是线性的,线上的每一个槽位可以更换数据,回溯算法槽位数据的更换是由for循环控制的,二叉树槽位数据的更换是手动写两个递归函数使它们参数列表不同来控制的。

2023-10-22 20:12:06 35

原创 Day28|491.递增子序列,46.全排列 ,47.全排列 II

java语言:HashSet添加用add();ArrayList判空用isEmpty();按照人脑思维顺序的写代码,深度控制应放在写第二层递归函数的时候写终止条件。树层选取元素的标准是HashSet无重复。递归:深度如何控制,宽度如何控制?树枝选取元素的标准是递增。

2023-10-21 17:10:47 31

原创 Day27|93.复原IP地址,78.子集,90.子集II

关于终止条件:每一层递归下去,待选池的首元索引不断增加即新的startIndex不断增加,最终会达到nums.length,自动结束函数。如果是数枝,前一个相同元素会被标记因为是一层一层走下来的,如果是树层,前一个相同元素就不会被标记,换首元的时候回溯过程恢复了false。一开始出现内存超出,原来是没有限制住每层递归的起始取值处,经常把startIndex打成0。用pointNum控制递归层数。java特点:用对字符串修改时先转成StringBuilder,忘记排序了,导致【4,4,4,1,4】没过。

2023-10-21 00:29:34 15

原创 Day26| 39. 组合总和 , 40.组合总和II , 131.分割回文串

对递归的更深一点认识从任意层看懂递归代码:回溯,只看当前层,理解要想结束自调用语句,其内嵌的自调用都要执行完,这样的实际意义是以当前树层的某个数字为头的所有组合已经组合完毕,需要换头了。第二次:第一个位置选一个其他的数(数据池位于第一层),第二个数字可选择的数不可再用第一次第一个位置用过的数(这一步就相当于去重了)可以重复使用同一个数的去重的做法,同不重复使用同一个数字一样。来创建一个新的副本,就像你原来的代码中所做的那样,以确保。时,实际上是创建了一个新的列表,其中包含了。中的元素不会受到影响。

2023-10-20 01:07:43 14

原创 Day25|216.组合总和III,17.电话号码的字母组合

组合问题递归变量里必须要有数据池的更新?第一题:第一个位置选一个数,第二个位置再在除已选的数据池选一个,第三个再在除已选的数据池选一个第二题:第一个递归函数的遍历池是digits[ 0 ],第二个递归函数的遍历池是digits[ 1 ],以此类推。

2023-10-17 11:05:56 26

原创 Day24|第77题. 组合

剪枝的截止条件:n - (k - path.size() ) + 1 号位置是最后一个满足k个数的位置,当 i 遍历完它后就结束循环,不需遍历剩下的 i ,完成剪枝。第一层四个头剪枝到2截止,因为从2是第一层最后一个满足k的有效个数遍历;第二层到3截止,从3开始遍历恰好3,4还剩两个,可满足k的个数。最后一层到4结束,4是最后一个遍历到末位能产生一个个数的位置。

2023-10-16 23:37:40 16

原创 Day22|669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树

大体上:用前序,理解当前层return意义,即可。

2023-10-14 18:37:32 27 1

原创 21|235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作

随着终止递归函数逐渐变得复杂,很多不能用最左下的三角表示,但依然可以构建普通三角,放在左下,下两角选左下作为终止递归函数研究对象,同级右节点默认过程与其一样,然后选取顶角作为过程递归函数研究对象。构建模型时,构建三角形的左斜边,两个点足矣。

2023-10-13 23:53:16 27

原创 Day20|530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236. 二叉树的最近公共祖先

中序——二叉搜索树,一个很好的锻炼遍历归的过程的模型。按照左角-->中-->右角顺序。

2023-10-13 00:16:50 39

原创 Day19|654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树

没看的视频都要补起来,都是基础思路得积累,前三题视频补,昨天的视频也要补。今天任性一把,先自己试着做了,花费时间太长,得不偿失。

2023-10-12 01:43:53 155

原创 Day18|513.找树左下角的值,112. 路径总和,106.从中序与后序遍历序列构造二叉树

513.找树左下角的值用全局变量追踪当前深度的可能最左叶节点构建【1,2,3,null,null,null,null】的后三层模型,第二三层null写递的终止条件,第二层和第三二层写叶子节点处理过程,感觉不够时再在上面接上一层,用三角形遍历顺序就行。

2023-10-10 22:26:57 59 1

原创 Day17| LeetCode:110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和

递归回溯的想法在计算机科学中,递归是一个函数在其自身内部调用自身的过程。递归的"递"指的是函数在调用自身时,将执行上下文(包括局部变量等信息)传递给下一次函数调用的过程。每一次函数调用都会产生一个新的执行上下文,这些上下文在函数不断调用自身的过程中累积,直到最终达到递归终止条件,所有的执行上下文都会按照调用的逆序逐一返回,这个过程被称为"回归"。因此,"递归"的"递"和"归"分别表示了函数在自我调用过程中执行上下文的传递和最终执行上下文的回归。

2023-10-10 02:20:34 189 1

原创 Day15| 104.二叉树的最大深度 (优先掌握递归), 111.二叉树的最小深度 (优先掌握递归), 222.完全二叉树的节点个数(优先掌握递归)

总结:自底而上的递归,用最后一层倒数第二层和负一层去构建图状的数据结构模型,以便写出代码。人麻了,前面的递归是自顶而下遍历,能人脑直观看到遍历不遗漏,并且操作语句在自调用前就完成----现在是操作语句是自调用后执行,那么执行顺序就是自底而上。

2023-10-08 00:01:01 22 1

原创 Day14| 101.对称二叉树, 226.翻转二叉树 (优先掌握递归),以及关于两个自调用递归函数的理解

每进入一个自调用函数,会出现两个自调用函数,但会留靠后的函数,优先进入靠前的函数,直到靠前的函数触到终止条件,此时进入到最后一层函数但被return了,就进入倒数第二层函数,倒数第二层函数就执行靠后的递归,一般两条自调用函数参数具有对称性,其中一个被return,另一个一般也被return,就这样从第一个自调用的倒数第二层函数体逆序执行第二个自调用函数,最外层的第二个自调用函数被最后执行。if语句外的return语句就没啥意义了,因为用不上,但应函数语法要求得写上。尤其是对称的值相等时调自身函数,

2023-10-06 23:20:29 28 1

原创 Day13|二叉树的递归遍历,迭代遍历

递归:更新节点与更新int的递归,画递归树状图或递归线性图,二叉树本来就是树状的较易理解。前序遍历:对于一个三角 中左右输出,直接进入最后一个子叶节点的函数中体会递归流程。前序是最简单的,在深度遍历左枝时就输出,左枝遍历到底,构成中左右逆时针三角。中序次简单,先深到左枝底部null,回溯的时候输出,构成左中右顺时针三角。体会用词深度遍历,想象成副对角线一条一条,自上而下积分,自左而右积分。回溯是直接把cur跳到父节点的right上,不是回溯到父节点上。后序遍历,对于一个三角 左右中输出。

2023-10-06 00:20:08 33 1

原创 Day12|239. 滑动窗口最大值,347.前 K 个高频元素

如果相等时就清栈:移除窗口的那个值此时在队首,且窗口内也有个相等的值,窗口内的这个值清了栈,自己到了队首,poll窗口外的那个最大值时实际上poll掉的是窗口内的这个最大值,所以peek值与队内值相等时不清栈。前面,实现了降序排列。这是因为对于相同的元素,它们的频率越高,值越大,因此。的值,结果将为正数,从而将。的值,结果将为正数,从而将。的选择会决定升序或降序排序。347.前 K 个高频元素。239. 滑动窗口最大值。的值时,应该排在前面。作为比较器,那么如果。前面,实现升序排列。

2023-10-04 21:19:45 30 1

原创 Day11|20. 有效的括号 , 1047. 删除字符串中的所有相邻重复项 ,150. 逆波兰表达式求值

栈里面相当于放的是左括号,数目与左括号对应。用栈存储并用String+号反转站内字符。047. 删除字符串中的所有相邻重复项。有判空的条件一定先判断,防止操作空栈。150. 逆波兰表达式求值。用字符串模拟栈的行为。

2023-10-03 17:56:38 32 1

原创 Day10|232.用栈实现队列

对于一个循环变量来说,判断其的两个状态:承前状态,刚刚更新完变量没有进入下一次循环的判断,启后状态,进入下一次循环的判断并执行操作。pop和peek的大体思路是把stackIn倒入stackOut,再从stackOut里pop元素,但是当stackOut里元素没pop完,stackIn里又加入了新元素,要加一个stackOut为空才能再倒入元素的判断语句,不然pop的顺序就出错了(会把新push的元素先于stackOut的既有元素pop出来)queue内部有isEmpty也不知道。这种数数是代码基本功。

2023-10-02 13:50:47 34 1

原创 Day9|28. 实现 strStr(),459.重复的子字符串

KMP。

2023-10-01 19:55:54 22

原创 Day8|344.反转字符串,541. 反转字符串II

344.反转字符串双指针同时移动。

2023-09-29 18:02:50 20

原创 Day7|454.四数相加II,383. 赎金信,15.三数之和, 18. 四数之和

a去重与b,c去重不一样,a要找之前有没有出现过,a要以防对身后left造成影响,以{-1,-1,2}这个结果集为例,如果a对i+1匹配,该结果集跳过。magazine相当于文本串,遍历其并记录到一个集合中(这里选数组即可)a只能暴力遍历一个个取,b和c从a后面用双指针缩小范围,把数组升序排列,Arrays.sort(nums);三数和以及四数和我都没有剪枝。而bc可以直接看后面有没有出现。分成两个O(n方)遍历。

2023-09-27 19:42:35 18 1

原创 Day6|242.有效的字母异位词, 349. 两个数组的交集, 202. 快乐数 , 1. 两数之和

用两个recordhash数组记录有没有出现,出现翻值为1,当两个recordhash同时为1时加入动态数组。细节,java里字符串对象的length()是方法故加(),数组的length是成员变量,不用()遍历nums1,存入set,遍历nums2时检测是否在set里出现过,出现过就存入resSet,循环时寻找target与cur的差之前有没有出现过,要用map存遍历过的数值及其对应标号。用减法运算把字符映射成index,在该char对应的index处记录其总共出现的次数。349. 两个数组的交集。

2023-09-25 22:04:06 19 1

原创 Day4|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II

思路:如果fast领先n步,fast到null时,slow到倒数第n个,若要删去倒数第n个节点,slow必须要停在倒数第(n+1)个节点上,那么fast要先走(n+1)步。领先n步两者间有n个空,代表n个循环的执行,而循环的条件又是用某一次循环的初态的确定的,去研究恰不执行的那个循环的初态,带着研究最后一次执行的那个循环。在节点2时,需考虑两个循环,一个是达到节点2的前一个循环,另一个是以节点2为初态的下一个循环。对于一个变量,以终态和初态分别参与两个循环。终态是前一个循环的结果,初态参与下一个循环。

2023-09-23 18:54:59 42 1

原创 Day3| 203.移除链表元素,707.设计链表,206.反转链表

检查时,重心都放在p有没有走到正确的位置上的代码逻辑有误问题,这个过程自己默认传入while的index值是合法的,实际上size的没更新,造成了越界,耗费了很多时间。一、想一下目标位置是由哪一个位置变化而来,假如目标位置是最后一个节点,由倒数第二个节点前进得来,那么这个过程就应当是最后一次循环的语句,其执行条件即是最后一次执行条件,其下一个过程的执行条件即是终止条件,一般取终止条件的否定,感觉这些条件判断要多见识积累。原因一:0号节点是从head.next开始的,递归太抽象了,脑子转不过来,有空再看,

2023-09-23 11:39:42 60 1

原创 Day2|977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

滑动窗口相比暴力省去了一些不必要的比较,在两层循环暴力写法中, i 一个不落的遍历完每一个数组值,同时对于每个 i ,j 都要遍历一遍下标 i 以后的数组值。这种暴力也形成了 i 为左端,j 为右端的窗口,i 遍历完数组,j通过暴力遍历所有右边寻找 i 右边的最短子数组,做到不遗漏。每填完一圈startCol(填充行元素的起点)和startRow(填充列元素的起点)都要“手动”更新,起点都是闭区间,行尾n - offSet和列尾n - offSet也要“手动”更新,终点都是开区间。感觉都在遍历查找填充。

2023-09-21 19:40:38 139 1

原创 Day1|数组理论基础,704. 二分查找,27. 移除元素

时长2~3h。

2023-09-20 18:13:10 240 2

空空如也

空空如也

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

TA关注的人

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