- 博客(43)
- 收藏
- 关注
原创 hot100(10)
同理,从右到左维护一个最小值min,在进入左段之前,那么遍历到的nums[i]也都是大于min的,要求的begin也就是最后一个大于min元素的位置。从左到右维护一个最大值max,在进入右段之前,那么遍历到的nums[i]都是小于max的,我们要求的end就是遍历中最后一个小于max元素的位置;每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。贪心策略,一直加和,负则抛弃,重新开始。
2025-02-08 08:11:10
1012
原创 hot100(9)
树形结构,且判断子树是否对称 与 判断原二叉树是否对称 是相同的问题,子问题与原文题具有相同的结构,考虑递归。dp[i] += dp[以j为头节点左子树节点数量]*dp[以j为头节点右子树节点数量]同时为了满足递推公式的乘法,避免结果都为0,dp[0]需要初始化为1。dp[i] : 1到i为节点组成的二叉搜索树的个数为dp[i]个。或者i个不同元素的节点组成的二叉搜索树的数量为dp[i]个。i从大到小,遍历i里每一个数作为头节点的状态,用j来遍历。j相当于是头节点的元素,从1遍历到i为止。
2025-02-07 15:13:18
621
原创 hot100(8)
那么可以想到如果先访问结点,再修改,就能避免修改造成的影响,只要按照右、左、中的顺序进行遍历,即后序遍历,将当前节点的右结点改成上一次访问的结点,即能满足题目要求,并且把左结点置为null,而左结点已经放问过了,不会有影响。首先回忆一下如何根据两个顺序构造一个唯一的二叉树,相信理论知识大家应该都清楚,就是以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。中序数组我们都切成了左中序数组和右中序数组了,那么后序数组就可以按照左中序数组的大小来切割,切成左后序数组和右后序数组。
2025-02-06 22:58:51
958
原创 hot100(7)
对于当前盛水的较短者,中间任意一根垂线与其组成的容器,其容量都不会大于当前的容量(高不会超过当前容器的高,宽会比当前容器的宽更小),如果要找到一个容量更大的容器,肯定不会包括这条线。降低时间复杂度的原因:利用数组有序的特性,用O(1)的时间得到了O(n)的信息(某个数和任何数相加都小于target或某个数和任何数相加都大于target)像前面的数组的累加遍历,需要用到前一个处理过的元素的值和当前元素累加,本题页需要一个pre指针记录当前遍历节点cur的前一个节点,这样才方便做累加。怎么一想这么麻烦呢。
2025-02-05 18:30:48
983
原创 hot100(6)
注意这里需要用String作为key ,而不能用char数组作为key,原因在于String的equals方法已经实现了基于内容的比较,而char数组的equals方法仍然是基于引用的比较。大多数人对于这题的第一直觉是找到每个可能的子串后判断它的有效性,但这样的时间复杂度会达到 O(n^3),无法通过所有测试用例。如果是有效字符串,那么在i-1位置的‘)'匹配的'('之前,必然有一个'(' 与i位置的')'相匹配。那么 dp[i] = dp[i-1] + 2 + dp[i - dp[i-1] - 2];
2025-02-04 15:51:54
726
原创 hot100(5)
我们在每次进行搜索时,如果遇到连续相同的括号我们只需要搜索一次即可,比如当前遇到的字符串为 "(((())",去掉前四个左括号中的任意一个,生成的字符串是一样的,均为 "((())",因此我们在尝试搜索时,只需去掉一个左括号进行下一轮搜索,不需要将前四个左括号都尝试一遍。3.层中逻辑:根据lremove 和 rremove,结合当前处理到的位置i进行从i开始的遍历,遍历到可能的位置,则删除该位置的括号,递归调用dfs,并传递对应的lremove和rremove参数。所以默认习惯 从前向后遍历。
2025-02-02 17:18:20
720
原创 hot100(4)
31.方法一:递归、dfs由树的结构想到使用递归解决,且路径相关问题容易考虑到使用dfs和bfs.使用dfs解决,这里关键在于如何设计递归函数。递归函数的参数:root,targetSum递归函数的返回值:以root为根节点,路径和为targetSum的数量递归函数的单层逻辑:(1)判断返回条件,root == null,return 0。
2025-01-30 16:02:42
1100
原创 leetcode hot100(3)
即如果使用滚动数组覆盖的话,只需要将j倒序遍历,不会覆盖到有效数据,覆盖到的数据都是未来用不到的。从记忆化的角度来考虑回文子串的判断,判断s.substring(i,j+1)是否是回文串,只需要判断其边缘和内部(已经判断过的)是否满足回文要求,即dp[i+1][j-1] && s.charAt(i) == s.charAt(j)递推顺序是从前往后的,因此计算dp[i]需要考虑前面的dp数组,对于dp[i],新增加了s的第i个字符,我们需要枚举这之前的所有切割点j,并结合对应的dp[j]进行考虑。
2025-01-22 12:02:02
778
原创 leetcode hot100(2)
考虑空间优化的话,dpmax,dpmin数组只在从前往后推导的时候用到,并且是相邻用到的,实际上用两个变量(但是由于for循环逻辑里dp递推关系是交叉的,还要区分过去的dpmax和现在dpmax,这里容易混淆)就可以替换。与最大子序和的递推方程不同的是,这里当前位置的最优解未必是由前一个位置转移得来的,原因在于乘法乘子有负数不是越乘越小的,而加法里的负数是越加越小的。否则找到的中间节点是右边的。在max和min的dp方程里,他们交叉存在,这是因为基于当前数字的正负,他们随时有交换逆转的可能。
2025-01-17 23:02:23
916
1
原创 leetcode hot100(1)
我们需要记忆的是目前还无法确定的,维护一个从栈底到栈顶单调递减的栈,直到下一个元素大于栈内,把栈内所有满足小于该元素的成员弹出,并得到这些成员的结果。单调栈的思想通常用于寻找“下一个更大”或者“下一个更小”的问题,核心在于用空间换取时间,实现一次遍历,记录下目前还不能确定答案,能在未来确定答案的元素。TopK问题,考虑使用堆作为数据结构,本题中维护一个大小为k的最小堆,读取完数据后在堆顶的即为第k大的数据。循环遍历listA的所有节点,循环内遍历B所有节点,检查当前遍历到的的A、B中的节点是否一致。
2024-10-27 14:34:43
708
原创 排序算法汇总
(2)j指针负责从右向左找比基准点小的元素,i指针负责从左向右找比基准点大的元素,一旦找到二者相交,直至i,j相交。(2)j指针负责找到比pivot小的元素,i指针指向待交换的元素,一旦j指针找到则与i进行交换。b.必须先找j,再找i,否则会在最后一次swap时出现问题,会把比pivot大的值交换到前面去。(3)i指针维护小于基准点元素的边界,也是每次交换的目标索引。(3)最后基准点与i(此时i与j相等)交换,i即为分区位置。(4)最后基准点与i交换,i即为分区位置。(1)选择最左元素作为基准点元素。
2024-10-27 10:52:01
305
原创 JVM的类加载过程
创建java.lang.Class对象,这个对象是C++Klass的mirror,用来表示这个类在JVM中的表示。(3)解析,将符号引用转为直接引用(如果A类的常量池中有B类的引用,要解析A类,必然对B类进行了类加载)(1)验证:确保类的字节码符合JVM规范,比如magic number:cafe babe。(2)准备:为类的静态变量分配内存(并不进行初始化赋值),静态变量此时赋默认值。通过类的全限定名找到类的.class字节码文件,加载到方法区中。执行静态代码块、静态变量赋值、初始化方法。
2024-10-07 15:00:35
393
原创 Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String
mybatis-spring 官方项目中使用 mybatis-plus-boot-starter 当前最新版本 3.5.4.1 ,其中依赖的 mybatis-spring 版本为 2.1.1。此时因为 factoryBeanObjectType 是 String 类型,不符合条件而抛出异常。核心原因在于整合的时候引入错了版本,引入了springboot2对应的版本。整合springboot3和mybatis时报告如上错误。
2024-09-13 18:02:32
409
1
原创 代码随想录 刷题记录-28 图论 (5)最短路径
在学习一种优化思路的时候,首先就要知道为什么要优化,遇到了什么问题。正如我在开篇就给大家交代清楚 堆优化方式的背景。堆优化的整体思路和 朴素版是大体一样的,区别是 堆优化从边的角度出发且利用堆来排序。Bellman_ford 是可以计算 负权值的单源最短路算法。其算法核心思路是对 所有边进行 n-1 次 松弛。弄清楚 什么是 松弛?为什么要 n-1 次?对理解Bellman_ford 非常重要。
2024-09-05 19:38:47
1567
原创 代码随想录 刷题记录-27 图论 (4)拓扑排序
所以,我们在代码实现的过程中,本质是要将 该节点作为出发点所连接的节点的 入度 减一 就可以了,这样好能根据入度找下一个节点,不用真在图里把这个节点删掉。问给规划出一条 完整的上课顺序。拓扑排序在文件处理上也有应用,我们在做项目安装文件包的时候,经常发现 复杂的文件依赖关系, A依赖B,B依赖C,B依赖D,C依赖E 等等。因为每次寻找入度为0的节点,不一定只有一个节点,可能很多节点入度都为0,所以要将这些入度为0的节点放到队列里,依次去处理。后面的过程一样的,节点3 和 节点4,入度都为0,选哪个都行。
2024-09-04 14:02:40
1172
原创 代码随想录 刷题记录-26 图论 (3)最小生成树
最后我们就生成了一个 最小生成树, 绿色的边将所有节点链接到一起,并且 保证权值是最小的,因为我们在更新 minDist 数组的时候,都是选距离 最小生成树最近的点 加入到树中。讲解上面的模拟过程的时候,我已经强调多次 minDist数组 是记录了 所有非生成树节点距离生成树的最小距离。最后,minDist数组 也就是记录的是最小生成树所有边的权值。
2024-09-04 12:49:40
1083
原创 代码随想录 刷题记录-24 图论 (1)理论基础 、深搜与广搜
在二叉树遍历的单层逻辑中,处理的是所有孩子结点。这就对应了图的深搜算法中“处理当前遍历到的节点的所有邻接点”
2024-09-02 21:34:23
1540
原创 代码随想录 刷题记录-23 单调栈
题目对“下一个更高”或者“下一个更低”有要求,可以考虑单调栈(也可以考虑双指针,双指针往往能够把时间复杂度的指数减一)
2024-09-01 23:30:00
1164
原创 代码随想录 刷题记录-22 动态规划(6)习题
本题最关键的是要想到dp[i]由哪些状态可以推出来,并取最大值,那么很自然就能想到递推公式:dp[i] = max(dp[i], dp[j] + 1);i++){j < i;j++){i++){动态规划之编辑距离总结篇动态规划最强总结篇。
2024-08-31 23:30:00
706
原创 代码随想录 刷题记录-21 动态规划(5)习题
这道题是树形DP的入门题目,所谓树形DP就是在树上进行递归公式的推导。只不过平时我们习惯了在一维数组或者二维数组上推导公式,一下子换成了树,就需要对树的遍历方式足够了解。Leetcode股票问题总结篇。
2024-08-30 23:30:00
1502
原创 代码随想录 刷题记录-20 动态规划(4)多重背包理论、背包问题总结
有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi.求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。多重背包和01背包是非常像的, 为什么和01背包像呢?背包中的关键问题:递推公式、遍历顺序、初始化。一、多重背包基本理论。
2024-08-29 23:30:00
199
原创 代码随想录 刷题记录-19 动态规划(3)完全背包理论、习题
本周的主题其实就是背包问题中的遍历顺序!我这里做一下总结:动态规划:518.零钱兑换II (opens new window)动态规划:377. 组合总和 Ⅳ (opens new window)动态规划:70. 爬楼梯进阶版(完全背包) (opens new window)动态规划:322. 零钱兑换 (opens new window)动态规划:279.完全平方数(opens new window)此时我们就已经把完全背包的遍历顺序研究的透透的了!5.139.单词拆分可以使用回溯法,会时间超限。
2024-08-28 23:30:00
865
原创 代码随想录 刷题记录-18 动态规划(2)01背包问题、习题
这道题目就是一道01背包应用类的题目,需要我们拆解题目,然后套入01背包的场景。01背包相对于本题,主要要理解,题目中物品是nums[i],重量是nums[i],价值也是nums[i],背包体积是sum/2。2.1049.最后一块石头的重量II本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。本题物品的重量为stones[i],物品的价值也为stones[i]。本题的目的是划分两个子集,使这两个子集和 的 差最小,可以转化为动态规划01背包问题。
2024-08-27 23:30:00
766
原创 代码随想录 刷题记录-18 动态规划(1)基本理论及习题
动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的,
2024-08-26 23:30:00
1992
原创 代码随想录 刷题记录-16 贪心算法(1)贪心理论基础及习题
想清楚局部最优,想清楚全局最优,感觉局部最优是可以推出全局最优,并想不出反例,那么就试一试贪心。2.376. 摆动序列。
2024-08-24 23:30:00
977
原创 代码随想录 刷题记录-14 回溯(3)字符串、子集、排列问题
这是一道标准的模板题.要清楚子集问题和组合问题、分割问题的的区别,子集是收集树形结构中树的所有节点的结果。而组合问题、分割问题是收集树形结构中叶子节点的结果。(前提是把抽象树看做是有“选谁”构成的)2.90.子集II本题用“取谁”的思想构造回溯树,取每一个结点存到答案里,但是要注意对树层去重。由于要对树层去重,数组首先要排序。回溯三部曲:(1)参数 :startIndex。
2024-08-22 23:30:00
900
原创 代码随想录 刷题记录-11 二叉树(5)习题
1.在有序树里,如果判断一个节点的左子树里有p,右子树里有q呢?因为是有序树,所以 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。那么只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是p 和 q的公共祖先。那问题来了,?
2024-08-19 23:30:00
1506
原创 代码随想录 刷题记录-10 二叉树(4)习题
这道题目刷过的同学未必真正了解这里面回溯的过程,以及结果是如何一层一层传上去的。那么我给大家归纳如下三点求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历回溯)实现从底向上的遍历方式。在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。
2024-08-18 23:30:00
1079
原创 代码随想录 刷题记录-9 二叉树(3)习题
1.404.左叶子之和这道题目要求左叶子之和,其实是比较绕的,因为不能判断本节点是不是左叶子节点。此时就要通过节点的父节点来判断其左孩子是不是左叶子了。平时我们解二叉树的题目时,已经习惯了通过节点的左右孩子判断本节点的属性,而本题我们要通过节点的父节点判断本节点的属性。2.513.找树左下角的值层序遍历迭代实现:或递归dfs实现:maxDepth要初始化成-1,避免一个结点的情况(深度为0的情况)修改不了3.112.路径总和本题探究递归函数返回值的问题。图中可以看出,遍历的路线,并不
2024-08-16 23:30:00
908
原创 代码随想录 刷题记录-8 二叉树(2)习题
本题要实现的算法是计算完全二叉树的结点个数,根据上图分析,如果一个完全二叉树不是满二叉树,那它的左右子树必然是满二叉树和完全二叉树,或都是满二叉树;其为完全二叉树的子树也可以按照同样的逻辑去处理这个问题,也就是说解决原问题的算法和子问题的算法是一致的,可以考虑递归实现。同上,从回溯的角度来理解,求最大深度就是做dfs,子问题和原问题的解决方案是一致的,可以使用回溯/递归的方法解决。然后是递归和回溯的过程,上面说过没有判断cur是否为空,那么在这里递归的时候,如果为空就不进行下一层递归了。
2024-08-15 23:30:00
721
原创 代码随想录-5 双指针法 刷题记录
双指针法并不隶属于某一种数据结构,我们在讲解数组,链表,字符串都用到了双指针法,所有有必要针对双指针法做一个总结。本文中一共介绍了leetcode上九道使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n^2)的时间复杂度,降为 $O(n)$
2024-08-11 23:30:00
1210
原创 代码随想录-3 哈希表 刷题记录
总结一下,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!二、题目1.242有效的字母异位词关注其中的哈希思想,判断一个元素是否出现过,出现过次数的场景,第一时间想到哈希法。i++){=0)
2024-08-10 23:30:00
853
原创 代码随想录-4 字符串 刷题记录
next数组就是一个前缀表(prefix table)。前缀表有什么作用呢?前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。(如果不使用前缀表,则是暴力解法,当模式串中间的某个字母不匹配时,模式串回退到开头,主串回退对应个数字母,主串向后挪一个继续尝试匹配。但是使用前缀表,就可以让主串在不回退的情况下找到模式串应当回退的位置,即最长公共前后缀前缀表是如何记录的呢?
2024-08-09 23:30:00
1642
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人