自定义博客皮肤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)
  • 收藏
  • 关注

原创 动态规划11 最长公共子序列

【代码】动态规划11 最长公共子序列。

2025-06-15 02:11:57 197

原创 动态规划-最长子序列

【代码】动态规划-最长子序列。

2025-06-12 18:29:52 254

原创 动态规划 08 买卖股票

第i天进行第j次买入也是用的第i-1天以及之前未进行第j次操作时的卖出得到的余额进行买入。第i天进行第j次卖出也是用的第i-1天以及之前买入的余额进行卖出,因此不能是。第i天之前完成第j次买入 / 第i天进行第j次买入。第i天之前完成第j次卖出/ 第i天进行第j次卖出。

2025-05-26 03:10:25 166

原创 day39 动态规划-打家劫舍

没有容量限制,只求最大值,只需要一个变量控制即可,就定义一个一维数组dp[i]表示从0-i个房屋内偷能偷到的最高金额。三、打家劫舍3树状bp略。

2025-05-26 00:29:36 211

原创 Day 32.动态规划part-04

把两两相撞的石头累加,等价于求两堆石头相撞剩下的最小重量,因此两堆石头的重量越接近,剩下的重量越小,极限为总重量的一半,我们要想办法使其中一堆石头的重量接近该极限。问题等价于:能否从石头里任选石头,来使容量为sum/2的背包装的重量最多。left - (sum - left) = target 推导出 left = (target + sum)/2。left + right = sum,而sum是固定的。target是固定的,sum是固定的,left就可以求出来。

2025-05-21 00:21:52 315

原创 Arrays.sort()自定义排序

它的核心方法是:java。

2025-05-20 00:36:15 262

原创 day32 动态规划-03 背包问题

因为dp[i]要由dp[i-1]推出,所以要将dp[0]全部初始化,当背包容量小于物品0的重量时,一件页装不下,dp[i]为0;当背包容量大于物品0的重量时,初始化为物品0的价值。dp[i][j] 表示背包容量为j时,从0-i个物品中任意选取可以获得的最大价值。4.遍历顺序:从前向后先物品再背包更好理解,但是先背包再物品也行。

2025-05-18 17:45:38 339

原创 31.动态规划-02

【代码】31.动态规划-02。

2025-05-17 06:18:03 244

原创 30.动态规划-01

把问题拆分成子问题,先解决小问题,再逐步构造大问题的解。

2025-05-17 05:07:00 209

原创 Day29 贪心part 03

如果从i+1到结尾没问题,那从i+1到结尾的任何一点段都可以到达,而且从i+1开始是最优情况,一定是积累油量最大化。先确定一边,再确定另一边。先从左到右比较左小于右的,再从右到左比较右小于左的,最终两个数组取最大值。如果从start到i不行,就从i+1重新开始。

2025-05-17 04:55:33 162

原创 代码随想录算法训练营day28:贪心法part2

全局最优:如果跳不到终点,等遍历到当前最大范围终点时更新最大范围(确保更新最大范围),每次往最大范围终点跳(反正一定能跳到),如何得到整体最大范围:遍历每个元素,计算当前元素下标+当前最大跳数,就是从每个点能达到的最远距离,取最大值。递归法太拘泥于具体步数怎么跳了,但其实对于每个下标,不管怎么跳,即使每次跳一步,总能走到最大可跳范围,即。全局最优:每天都看一下股票,只对赚的进行买卖操作,相当于只赚不赔,赚的最多。空间复杂度:每次只跳一步,最大调用栈深度为n,空间复杂度为O(n)。局部最优:每次取最大跳数。

2025-04-09 23:27:48 400

原创 代码随想录算法训练营day27 贪心法part1

当子数组的和变为负数的时候,就可以丢弃了,因为后面的子数组一定是不需要这段和为负数的子数组的,只需要再用一个result变量记录遍历过程中遇到的子数组的最大值即可。1.用大饼干先满足大孩子,遍历孩子,饼干后动(因为若有结果大饼干一定可以满足小孩子,如果遍历饼干可能有所有饼干都满足不了最大的孩子的情况,如何证明合理性: 一般没人问,自己随便解释一下,凭感觉,或者举不出反例。2.用小饼干先满足小孩子,遍历饼干,孩子后动(因为若有结果小孩子一定会被大饼干满足,3.求解每一个子问题的最优解。

2025-04-09 03:51:49 310

原创 代码随想录算法训练营day25 回溯part4

对于全排列的去重,本质也是树层去重,但是因为每层都要从0开始遍历,所以不仅要判断nums[i] == nums[i-1];还要判断nums[i-1]是否被使用过,如果被使用过却跳过,此时跳过循环会导致树枝去重,因为这时used[i]为true表面是前面的位置使用的,而不是当前位置使用过的。而回溯结束后会充值used[i]为false,此时如果nums[i] == nums[i-1]且used[i-1]为false,表面是层间出现的重复,可以放心跳过循环去重。因此全排列的used应该为全局变量。

2025-04-07 20:03:48 347

原创 代码随想录算法训练营第24天:回溯法part3

子集的问题是取所有路径上的节点,而组合和切割问题是只取叶子节点上的结果,因此子集的结果每次都要存,不加限制条件。本题的终止条件是字符串都合法,因此需要有一个变量pointNum来记录合法个数,当为4个的时候返回。子集问题的终止条件: index大于等于数组的长度,也就是到达叶子节点。递归的处理变成: 如果当前切的字符串合法,就插入逗号。跟组合之和Ⅱ一样,找到重复产生的原因就知道怎么去重。

2025-04-07 18:30:29 356

原创 代码随想录算法训练营Day23:回溯法part2

而递归是为下一个位置开始选元素,也就是增加下一个分割线 |。而不需要的[1,7][7,1]重复是在for循环的横向遍历中发生的,为了去重首先需要排序,现在有[1,1,7],递归参数i+1保证当前从7开始时不会再去读1,而for循环的时候导致第一个1开始时读了一次7,第二个1开始的时候会导致前一个1所有的答案都会再读一个,因此去重复path的关键因素是在for循环中比表跳过重复元素。根据树形图:1,1,6里的重复1是在纵向递归中加入的,递归的参数i+1保证跳过第一个当前1,但可以继续加入后续的。

2025-04-03 23:58:04 214

原创 代码随想录算法训练营Day 22:回溯法

backtracking返回值一般为void,参数不像二叉树递归一样容易确定,因此一般先写逻辑,需要什么参数,再写什么参数。回溯法的本质是穷举,回溯是递归的副产品,有递归就有回溯。但回溯法不一定非要用递归。for循环横向遍历,一个节点有多少孩子,for循环就遍历多少次;重点是想清楚参数如何表达和处理电话号码的映射。也是到叶子节点,满足条件,存入结果。注意递归的时候是继续i+1。1. 回溯的返回值和参数。四、电话号码的字母组合。2. 回溯的终止条件。3. 回溯的遍历过程。

2025-04-02 02:01:56 310

原创 代码随想录算法训练营day20

从上往下遍历,第一次遇到的在[p.val, q,val] 区间内的节点就是最近公众祖先。遇到空节点,创建新节点插入,返回新节点。简单的方法是按顺序遍历,只在空节点插入,使新节点成为叶子节点,无需改变二叉树结构。也可以让左孩子继位,需要把右子树拆下来,插入到左子树的最右边确保还是二叉搜索树。可以让右孩子继位,需要把左子树拆下来,插入到右子树的最左边确保还是二叉搜索树;对结点的处理:没有处理,或者说判断符合条件的直接返回,但是可以省略。删除需要跟据其左右节点是否为空考虑五种情况,影响到我们对节点的处理。

2025-03-17 20:07:10 446

原创 代码随想录算法训练营第十八天-二叉树part06

要想判断该节点是不是最小公共祖先,需要先判断左子树和右子树是否可达p和q,而且要找深度最大的,一定是遇到的第一个公共祖先,可以把这个节点一路返回给根节点,所以应该采用后后序遍历先处理左右子树。对节点的处理: 如果left为空或者right为空,说明有一条路径不可达p或q,向上返回另一条路径,如果另一条路径也不可达自然是空值。都为空肯定不可达也应该返回空。跟上一题差不多,只需要记住二叉搜索树的中序遍历是递增的,因此最小的两个节点的差一定是中序遍历相邻的两个节点,双指针在每次遍历的时候处理一下就行。

2025-03-15 21:50:36 339

原创 代码随想录算法训练营day17

只需要中序遍历,加个pre指针每遍历一个节点与前一个节点比较。需要记住:二叉搜索树的中序遍历是单调递增的(充要条件)走进误区了,二叉搜索树是左子树<根<右子树;不是左节点<根<右节点。

2025-03-15 18:58:31 182

原创 代码随想录算法训练营day16 二叉树part4

递归终止条件:当前节点为空,没有比较的必要返回false。当前节点为叶子节点,且更新后的目标节点为0(等价于当前叶子节点的值刚好等于目标值),返回true。1.有左节点没右节点,返回false||右递归 2.有右节点无左节点, 返回左递归|| false 3.有右也有左,返回左递归||右递归,合并一下就只剩:左递归||右递归。要一个变量记录深度,一个变量记录左节点的值,最后对应深度最大的最左节点即为树的左下角。对节点的处理:不处理节点,当深度变大的时候记录当前左节点的值并更新深度。

2025-03-14 20:02:44 371

原创 代码随想录算法训练营day15

还是优先考虑递归,平衡二叉树的定义是左右子树的高度差不超过1,因此递归函数的返回值应该是子树的高度,对访问节点的处理是求左右子树的高度差。直接在不平衡的时候返回-1,一路传递到根节点。因此不应该判断当前访问的节点是不是左叶子节点,既然每个节点都要处理,可以在处理节点的时候,判断一下该节点的孩子是不是左叶子节点。一开始想到中后序迭代遍历的时候,有一个cur每次都直接到最左节点,便想用后序迭代,但是其实cur每次只是去到了子树的最左节点,不是左叶子节点,而是经过所有的结点,最后停在叶子节点的空孩子。

2025-03-13 18:50:53 401

原创 代码随想录算法训练营第14天

判断的是两棵树是否对称,因此只有参数1的左右子树都和参数二的右左子树对称了,才有资格说参数1和参数2两棵树是对称的,是后序遍历,一个左右根,一个右左根。因为我们是通过高度求深度,求高度是叶子节点的高度,前提是有叶子节点,所以没有某一子树的时候那个方向上是没有叶子的,只能返回另一棵树的最小高度+1。处理当前节点: 如果左右子树都和另一棵树对称,且跟据前面的条件已经确保当前节点也和另一棵树节点值相等,两棵树对称,返回true。处理节点: 返回当前节点深度 = max(左孩子的最大深度,右孩子的最大深度)+1。

2025-03-12 08:01:00 402

原创 代码随想录算法训练营第十三天 二叉树

中序2:cur一路向左一路压栈,确保栈里的元素都是左节点,每次结束完一颗子树的访问之后出栈,确保上一层的访问是始终从左开始。如果右孩子为空,下一轮循环会直接弹出父节点去处理父节点以及父节点的右孩子(自己的父节点和右兄弟永远在下轮和下下轮循环中处理)。换句话说,把叶子节点的左右节点都视为null,其实处理的全都是中间结点。核心思想是:二叉树的访问和处理是不同步的,cur只是访问结点,可以按任意顺序访问,但是处理需要按特定顺序。3.二叉搜索树(排序树):左节点(如果有)< 根节点 < 右节点(如果有)。

2025-03-11 03:52:18 275

原创 代码随想录算法训练营第九天:字符串part2

思路: 直接用split()和trim()库函数去掉空格,然后用Collections.reverse()反转List,然后拼接单词。在快指针遍历的过程中,只需要移除首位空格和重复的,把这个条件拎出来,剩下的直接复制。String.join() 是用于 拼接字符串 的方法,它可以将一个。第一次反转整个字符串 abcdefg 变gfedcba;思路:和上题反转单词差不多,把前后两段看成两个单词。按照指定的分隔符连接成一个新的字符串。然后分别反转两段变成 fgabcde。1.移除重复和首尾的空格(双指针)

2025-03-09 21:41:00 220

原创 代码随想录算法训练营11天 栈和队列part2

滑动窗口向右移动,在新进来的元素之前所有比新进来的元素小的,一定比新元素先出,不可能等到自己成为最大值,可以不维护。因此每次有新元素进入的时候,都要清空前面比新元素小的元素,留在新元素前面的一定都是比新元素大。暴力法时间超限的原因是,每次都重新在窗口里面挨个比较选出最大的值,但是其实每次窗口的变化只有首尾元素,里面很多元素已经不可能成为窗口内的最大值了,重点是避免重复遍历比较这些值。栈的经典应用,遇到数字就入栈,遇到字符就出栈计算,将结果再压入栈,计算结束栈中应该只剩一个数字。注意除法需要特殊处理。

2025-03-09 21:35:59 274

原创 代码随想录算法训练营第十天:栈和队列part1

栈2不为空就直接出栈,栈2为空就去栈1里进货。需要注意的是每次pop和peek都要判断栈是否为空,只有栈2空了才能再压入元素,否则顺序会乱,每次移动元素就将栈1全部清空压入栈2以保证顺序。一个栈相当于可以颠倒一次元素顺序,由于第一个栈的元素进去后都被压在栈底,要想取出底部元素要实现先进后出,就要把它们再取出来压入第二个栈,这样元素又出现在栈顶了。头尾O(1),随机O(n)。Java提供了Queue和Deque(继承自Queue)的接口,队列常见操作:offer,poll,peek,isEmpty。

2025-03-08 08:53:44 489

原创 八股Day1:TCP/IP网络模型和OSI模型

2. TCP/IP先于OSI出现,且TCP/IP(美国国防部)先有的协议,然后总结成的模型,Unix 早期版本就内置了 TCP/IP,使其成为学术界和工业界的首选。应用层负责处理数据的表示,编码和会话管理(对应OSI的应用层、表示层、会话层),也就是负责产生数据。应用层传输的数据可能很大,如果数据包超过TCP最大报文段,就要把数据包分块,重传只需要传某一块,而不用重新发送整个数据包。IP协议会为传输层的报文加上IP包头部组成IP报文,如果IP报文长度超过MTU(以太网一般为1500字节),会再次进行分片。

2025-03-06 04:16:26 1834

原创 代码随想录算法训练营第七天

思路:创建一个新的数组,然后对照就数组填充新数组,遇到数字就替换为number。Java创建新数组,所以从前到后和从后到前遍历无所谓。思路跟反转字符串差不多,只是要加上特定的位置,变成根据索引index反转字index符串中的某一段。2.剩余的字符数和k的关系,比较index+k与n的关系就行,index+k>=s.length表示剩余不足k个。与0异或不变,满足交换和结合率。1.字符串长度小于等于k反转整个字符串。将字符数组转换回字符串。(后面发现1包含着2里)

2025-03-05 20:33:15 315

原创 代码随想录算法训练营第七天 哈希表part

a + 1 是 下一个元素,但 a 可能是 第一次出现 不能因为 nums[a] 和后一个相同就跳过,否则 有可能漏掉正确的解。三数之和和两数之和逻辑相同,只是外面加一层循环,target变成第一个数相关的参数,求剩下两个数的和。(正确去重逻辑):a 代表当前固定的数 ,nums[a - 1] 是上一次选的数, 如果 nums[a] 和 nums[a - 1] 相同,就跳过,防止选到相同的解。跟两数相加差不多,把四个数拆成两个(两数和),需要考虑两数和会有重复,可以用Map的value存储出现次数。

2025-03-04 22:01:39 277

原创 代码随想录算法训练营第六天

(2)不是 数据结构,而是一种 数据流(pipeline),可以执行批量操作(如 map()、filter()、 collect() 等)。(1)Stream<Integer> 是 Stream 的泛型形式,表示流中存储的是 Integer 类型的元素。用空间换时间,因为遍历和寻找的都是数组中的元素,可以把已经遍历过的元素存起来,减少寻找的时间开销。要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。集合长度.size()。

2025-03-03 21:23:13 1421

原创 代码随想录算法训练营第四天 链表part2

似乎发现了规律: 先改着链表,发现哪个节点不可达了就在它被改之前用一个变量临时引用上,随改随画结构图。19.删除链表的倒数第N个节点。面试题 02.07. 链表相交。总结:链表操作能+虚拟头结点就加。24. 两两交换链表中的节点。142.环形链表II。

2025-03-01 21:24:55 351

原创 代码随想录算法训练营第三天

需要注意的是返回的时候要返回的一直是真正的原头节点dummy.next。加上虚拟头结点之后逻辑统一,和不加的删除非头节点时候一样。不加虚拟头节点就要单写删除头节点特殊情况。加虚拟头节点不用再单写删除头节点特殊情况。感觉递归法没啥意义就不记了。

2025-02-28 21:15:46 307

原创 代码随想录算法训练营第二天

后来发现按圈数确定坐标边界好乱,还不如直接加几个边界变量。第1列 n-1行到1+1行。第n列 1+1行到n行。第n行 n-1列到1列。第1行 1列到n列。一、长度最小的子数组。

2025-02-28 01:59:35 1160

原创 代码随想录算法训练营第一天

对于一个数组。

2025-02-27 08:06:53 287

空空如也

空空如也

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

TA关注的人

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