自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法训练营第45天|300.最长递增子序列|674. 最长连续递增序列|718. 最长重复子数组

思路:如果当前值比之前的值大,那么子序列长度加一。最后的结果是dp[i]的最大值。思路:这道题比上一道更简单,只需考虑前一个数,其他的思路都没什么变化。出错原因:求最大值的时候没有遍历初始化的区域。导致部分样例无法通过。思路:二维的dp,搞清楚dp含义以及各个状态之间的关系即可。674. 最长连续递增序列。718. 最长重复子数组。300.最长递增子序列。

2024-07-20 20:26:44 18

原创 算法训练营第44天|188.买卖股票的最佳时机IV|309.最佳买卖股票时机含冷冻期|714.买卖股票的最佳时机含手续费

初始化:在初始化时不要死扣定义,因为很可能它就是一个非法状态,没有定义,应该通过递推公式去设置初始值。,这类题目的主要操作在于记录前面的状态,并且知道状态之间的转换。思路:本题是123.买卖股票的最佳时机III 的进阶版。思路:这道题很简单,就只是买入时加了手续费。714.买卖股票的最佳时机含手续费。309.最佳买卖股票时机含冷冻期。188.买卖股票的最佳时机IV。状态分析:有四个状态。2.当天卖出股票状态。4.可以买入股票状态。

2024-07-20 15:44:00 30

原创 算法训练营第43天|121. 买卖股票的最佳时机|122.买卖股票的最佳时机II|123.买卖股票的最佳时机III

dp[i][j]中,j表示各种状态,i表示第几天,dp表示剩余的最大现金。123.买卖股票的最佳时机III。122.买卖股票的最佳时机II。3.第一次卖出后不持有股票的状态。5.第二次卖出后不持有股票的状态。121. 买卖股票的最佳时机。下面的递推式保证了只买一次。下面的递推式可以买卖多次。2.第一次持有股票的状态。4.第二次持有股票的状态。1.未曾买入的初始状态。

2024-07-18 22:36:13 65

原创 算法训练营第42天|198.打家劫舍|213.打家劫舍II|337.打家劫舍III

思路:这是一道树形dp,但是并不是很困难,本质是遍历树然后存储子树结果,之后再返回上一层,是后序遍历。思路:偷或者不偷,普通的动态规划问题,但要注意特殊值,因为要初始化两个值,但是输入可能只有一个。每个节点都会有选择和不选择两种情况,所以递归函数返回值是一个有两个值的一维数组。拆分的时候用到了上一题,但是要搞定数组相对位置。其中,情况2或者情况3已经包含了情况1。思路:环形问题要试着将其展开为多个。,例如本题可以分为三种情况。337.打家劫舍III。213.打家劫舍II。

2024-07-18 15:42:59 121

原创 算法训练营第41天|322. 零钱兑换|279.完全平方数|139.单词拆分

思路:是常规的动态规划,一开始想要尝试使用双指针完成,结果部分案例会失败,这个方法注定不能完全通过。这道题难点是看到处理字符串就会蒙,其实并不难,将字符串看成下标,同时截取子串其实很好弄。

2024-07-18 08:51:36 81

原创 算法训练营第40天|完全背包|518. 零钱兑换 II|377. 组合总和 Ⅳ|70. 爬楼梯 (进阶)

注意:如果求方法数递推公式是+,这道题求的是组合数,所以要先遍历物品,再遍历背包,这样的话物品会有确定的顺序。注意:这道题求的是排序,需要先遍历背包,再遍历物品。这样的话不同顺序的排列是不同的结果。这道题最重要的是顺着题意将dp[0]初始化为1,没有意义但是符合递推的初始化。518. 零钱兑换 II。70. 爬楼梯 (进阶)377. 组合总和 Ⅳ。

2024-07-17 12:26:26 99

原创 算法训练营第38天|1049. 最后一块石头的重量 II|494. 目标和|474.一和零

dp[0][0]=1,表示如果数组什么都没有的话,和为0只有一种方法,第一行其余初始化为0,表示如果数组什么都没有的话,和为其他值没有方法。2.dp[i][j]表示在0的个数小于i,1的个数小于j的情况下,最多有这么多的字串。2.未考虑x<0的情况,这种情况也是要直接返回0的,因为一群非负数的和不可能是负数。:假设加法的总和为x,那么减法对应的总和就是sum - x,所以我们要求的是。错误点:1.初始化错误,使用上述的dp数组更容易初始化,即前i个的和。:nums数组前i个数字,和为j的组合数。

2024-07-16 20:21:15 143

原创 算法训练营第37天|01背包问题 二维|01背包问题 一维|416. 分割等和子集

所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);思路:相当于一层一层覆盖,因为要利用上一层的数据,所以第二层要从后往前遍历,并且只能先物品后背包容积。本题要求集合里能否出现总和为 sum / 2 的子集。1.确定dp数组以及下标的含义。416. 分割等和子集。

2024-07-16 11:10:14 98

原创 算法训练营第36天|62.不同路径|63. 不同路径 II|343.整数拆分

一个是j * dp[i - j],相当于是拆分(i - j)dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。1.确定dp数组(dp table)以及下标的含义。其实可以从1遍历j,然后有两种渠道得到dp[i].可以想 dp[i]最大乘积是怎么得到的呢?遇到障碍物可以理解为到达此路径的道路为0。一个是j * (i - j) 直接相乘。96.不同的二叉搜索树 (可跳过)63. 不同路径 II。

2024-07-16 08:53:58 74

原创 算法训练营第35天|理论基础|509. 斐波那契数|70. 爬楼梯|746. 使用最小花费爬楼梯

很简单,但不要忘了特殊情况(n==1||n==0)注意:要弄懂dp数组含义,并且正确初始化。746. 使用最小花费爬楼梯。509. 斐波那契数。此题和上一题基本类似。

2024-07-11 09:18:10 82

原创 算法训练营第35天|56. 合并区间|738.单调递增的数字

思路:和之前的题目类似,记得区间两侧如何更新,以及最后一个区间也要加到结果集。2.结果处理时越界导致数值错误,用longlong即可解决。思路:遇到递减的数字,首位减一,其余位置均赋为9。从后往前遍历,要用到之前处理的结果才行。错误原因:1.思路错误,上述条件缺一不可。968.监控二叉树 (可跳过)738.单调递增的数字。

2024-07-10 18:53:40 69

原创 算法训练营第33天|452. 用最少数量的箭引爆气球|435. 无重叠区间|763.划分字母区间

思路:首先按左边界排序,然后根据右边界决定是否要射箭。思路:找到每个字母出现的最后位置,之后遍历。思路:求交叉区间总数(与上一题类似)452. 用最少数量的箭引爆气球。435. 无重叠区间。763.划分字母区间。

2024-07-10 15:29:13 79

原创 算法训练营第31天|134. 加油站|135. 分发糖果|860.柠檬水找零|406.根据身高重建队列

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。优化:本来打算用map或者set记录钱币数目,结果是用三个int值就可以完成,因为钱币金额固定。再根据数目从前到后插入(因为将后面的往前插不会影响前面已经排好的)思路:这道题有两个维度,身高和数目,要排好一个再去尝试排另一个。思路:记录钱币数目,看是否可以找。406.根据身高重建队列。

2024-07-10 10:06:02 293

原创 算法训练营第30天|122.买卖股票的最佳时机II|55. 跳跃游戏|45.跳跃游戏II|1005.K次取反后最大化的数组和

思路:如果有负数则对绝对值最大的负数进行取反,如果全为非负数则对最小的数重复取反。局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。思路:只有前一天与后一天的利润为正时,才将其加入总利润。出错点:数组的遍历,遍历范围应该是覆盖范围内。整体最优:一步尽可能多走,从而达到最少步数。1005.K次取反后最大化的数组和。122.买卖股票的最佳时机II。思路:找最大覆盖范围。

2024-07-06 15:44:36 154

原创 算法训练营第29天|理论基础|455.分发饼干|376. 摆动序列

理论基础本质。455.分发饼干思路:大饼干尽量去喂胃口大的;或者小饼干尽量喂出去。376. 摆动序列。

2024-07-01 10:48:20 347

原创 算法训练营第28天|491.递增子序列|

因为 一刷 也不求大家能把这么难的问题解决,大家目前能了解一下题目的要求,了解一下解题思路,不求能直接写出代码,先大概熟悉一下这些题,二刷的时候,随着对回溯算法的深入理解,再去解决如下三题。N皇后这道题目还是很经典的,一刷的录友们建议看看视频了解了解大体思路 就可以 (如果没时间本次就直接跳过) ,先有个印象,二刷的时候重点解决。同样,一刷的录友们建议看看视频了解了解大体思路(如果没时间本次就直接跳过),先有个印象,二刷的时候重点解决。本题很难,一刷的录友刷起来 比较费力,可以留给二刷的时候再去解决。

2024-06-26 21:18:20 293

原创 算法训练营第27天|93.复原IP地址|78.子集|90.子集II

思路:其实就是切割子字符串,只不过子字符串有要求:不能以0开头,不能大于255,只能切4个。子集问题,就是收集树形结构中,每一个节点的结果。整体代码其实和 回溯模板都是差不多的。1.加了排序和去重,其余与上一题完全一致。2.要注意不能访问越界。

2024-06-24 15:43:58 103

原创 算法训练营第26天|39. 组合总和|40.组合总和II|131.分割回文串

1.本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制。即为切割下来的字串。2.除了等于target要返回,大于target也不需要再往下搜索。排序:Arrays.sort(candidates);1.首先排序,使相同元素相邻。

2024-06-24 14:34:10 109

原创 算法训练营第24天|理论基础|77. 组合|216.组合总和III|17.电话号码的字母组合

1.可以通过map实现映射,如果key是int,也可以用数组实现映射。回溯法通过递归的方式帮助我们控制for循环层数。与上一题框架完全相同,只是增加了对结果集的要求。2.注意特殊输入:空字符串的处理。17.电话号码的字母组合。216.组合总和III。回溯:for循环加递归。

2024-06-24 09:36:42 93

原创 二叉树遍历

涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。所以求普通二叉树的属性还是要具体问题具体分析。也用了前序,这是为了方便让父节点指向子节点。

2024-06-22 11:35:02 172

原创 算法训练营第23天|669. 修剪二叉搜索树|108.将有序数组转换为二叉搜索树|538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树。

2024-06-22 11:15:08 142

原创 代码训练营第22天|235. 二叉搜索树的最近公共祖先|701.二叉搜索树中的插入操作|450.删除二叉搜索树中的节点

返回删除了值为val的节点之后的根节点。

2024-06-20 01:33:44 140

原创 代码训练营第21天|530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差思路:双指针操作,记录前一个遍历的节点即可。501.二叉搜索树中的众数普通二叉树思想:遍历二叉树求得每个数出现的频率,用map存储,对频率排序。二叉搜索树思想:中序遍历,记录当前节点出现频率和节点出现最高频率。(当前节点出现频率默认初始值为1)中序遍历:左中右,中就是处理逻辑。236. 二叉树的最近公共祖先。

2024-06-19 11:17:02 199

原创 代码训练营第20天|654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

1.可以在一棵二叉树上进行修改,且不需要新建节点,直接返回对应节点即可。如果两棵树都有则值相加,如果只有一棵树有保持不动或者将另一棵树的节点拿过来。2.在只有一棵树有时停止递归,并不需要遍历整个树。因为此时嫁接过来即可,不会改变节点值。2.使用双指针,即记录遍历的前一个节点。通过两个节点比较,移动最后确定遍历结果是否有序。二叉搜索树明确了遍历方向,所以用迭代法也很简单。因为一定要先构造根节点,再构造左右。中序遍历结果是有序的,是递增的。1.遇到 搜索树,一定想着。,这样才能利用上特性。

2024-06-18 14:47:04 115

原创 算法训练营第17天|513找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树

513 找树左下角的值1.使用层序遍历会较为简洁易懂,记得是用队列辅助树的层序遍历。2.使用递归核心思想是找深度最深的节点,即叶子节点,遍历时先左后右,深度大于当前节点时才更新。所以同层次的叶子节点只会保留最左边叶子节点的值。112 路径总和1.什么时候递归函数有返回值,什么时候递归函数没有返回值当我们只寻找符合要求的一条路径时,就有返回值,如果我们要遍历所有路径时,就没有返回值。113. 路径总和iijava中除了基本类型默认引用传递,值会一直被改变,如果要存储中间结果,开辟新空间进行存储。

2024-06-17 22:11:43 96

原创 算法训练营第16天|110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

3.如何判断是满二叉树:从根节点一直向左遍历直到叶子节点得到左侧深度,和一直向右遍历直到叶子节点得到右侧深度,左侧深度和右侧深度是相同的。4.思路:判断是否为空,如果是就返回0;判断是否为满二叉树,如果是就直接返回该子树个数;思路:递归计算左右子树高度,如果已经违反平衡二叉树,则返回错误值,否则返回高度。思路:遍历二叉树,使用前序遍历,因为只有前序遍历才能让父节点指向孩子节点。后序遍历,返回值的意义是:以该节点为根节点的子树的左叶子之和。2.满二叉树特性:知道深度可以直接求节点个数。

2024-06-17 10:30:36 222

原创 算法训练营第15天|层序遍历10 226.翻转二叉树 101.对称二叉树 2 104.二叉树的最大深度 111.二叉树的最小深度

如果使用中序遍历要特殊思考,因为翻转左,翻转中,翻转右会导致子树一边被翻转两次,另一边没有被翻转。2.使用后序遍历,因为我们需要收集左右孩子的节点,向上一层返回。2.每一层节点数量多少是需要记录的,否则在队列里会分不清到底是哪一层元素。思路:1.左子树和右子树可以相互翻转的树为对称二叉树。3.叶子节点的判断标准是左右节点同时为null.1.树本身是不能完成层序遍历的,需要借助。深度:从上往下(所以用前序遍历)中左右。高度:从下往上(所以用后序遍历)左右中。根节点的高度就是这棵树的最大深度。

2024-06-14 10:41:41 100

原创 算法训练营第14天| 理论基础 递归遍历 迭代遍历 统一迭代

逻辑:如果当前指针不为空。则向栈压入当前节点,指针指向当前节点左节点。如果当前指针为空,那么栈弹出节点,当前指针指向弹出节点的右节点,同时弹出节点加入结果数组。可以用一个指针遍历各个节点,用栈记录遍历过的各个节点,再用栈弹出元素,处理元素顺序才是中序遍历。顺序和处理顺序相同,所以用迭代很好写。先处理当前元素,再压入右节点,再压入左节点。满二叉树,完全二叉树,二叉搜索树,平衡二叉搜索树。存储方式:线性存储和链式存储(通用存储方式)1.编程语言实现递归的逻辑:栈这种数据结构。可以中右左,再进行翻转。

2024-06-10 08:11:58 174

原创 算法训练营第13天|239. 滑动窗口最大值 347.前 K 个高频元素 总结

以下为如何遍历map的方法,即使用entrySet()将map转化为set,然后通过getKey(),getValue()得到相应的值。这个列表可以弹入元素,弹出元素,获取列表最大值。优先级队列默认为是小顶堆,可以通过写lambda表达式将其设置为大顶堆,下面是小顶堆书写方式。用小顶堆,因为pop最小的元素,所有遍历一遍之后,堆中留下较大的k个元素。如果列表头的元素等于要弹出的元素,那么弹出,否则不动。如果a=b;弹入元素为a,列表尾部元素为b;

2024-06-08 11:34:22 193

原创 算法训练营第11天|20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

栈很适合做这种类似于相邻字符的消除的操作,因为栈帮助我们记录了遍历数组当前元素时候,前一个元素是什么。运算式的后序遍历,平时常见的是中序遍历,逆波兰式不需要加括号。主要是要分清最后字符串的顺序,用栈操作最后要翻转字符串。可以用字符串直接操作,这样就不需要再翻转字符串。(3)左右括号的个数相同但是不匹配。未判断栈是否为空就进行栈弹出操作。,可能需要的顺序不是跳出顺序。括号匹配很适合栈的先进后出。3.出现的问题:越界访问。2.使用栈一定要注意。

2024-06-05 13:17:46 129

原创 String,StringBuilder,StringBuffer的区别

是JDK5.0后出来的,专门针对单线程,是单线程版的StringBuffer,对多线程不。3.效率:StringBuilder > StringBuffer > String。是不可变对象,每一次对String对象的更改相当于生成一个新的String对象。都是可更改的对象,效率要大于String。是支持多线程同步的,是多线程安全的。

2024-06-05 11:34:36 119

原创 算法训练营第10天|理论基础 232.用栈实现队列 225. 用队列实现栈

分清this.pop和stackout.pop的区别。this.push和stackout.push的区别。的,而Vector支持线程同步,所以整体性能相对较低,如果没有多线程的场景,不建议使用Stack。LinkedList实现了List,Deque(实现了Queue接口)的接口,底层是。如果用两个队列操作,另一个队列只是当备份的角色。实现的,所以不仅可以表示栈,也可以表示队列。2.获取栈顶元素相当于构建的栈弹出再压入。一个栈管理压入,一个栈管理弹出。Stack底层是使用。

2024-06-03 21:37:20 321

原创 算法训练营第九天|28. 实现 strStr()459.重复的子字符串 字符串总结 双指针回顾

KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。KMP的精髓所在就是前缀表(待理解)

2024-06-03 20:05:08 188

原创 算法训练营第八天|344.反转字符串541. 反转字符串II 卡码网:54.替换数字151.翻转字符串里的单词 卡码网:55.右旋转字符串

1.Java中的八种基本数据类型,包括:整型(byte、short、int、long)、浮点型(float、double)、字符型(char)和布尔型(boolean)4.对string串操作时需要将其转化为字符串,操作完成之后再将其转化为string。处理好边界问题,可以采用较小数字去带入,要考虑奇数和偶数的不同情况。需要对数据一段一段处理时,i可以一段一段地去跳。第一步:去除多余空格,原地操作可以使用双指针法。基本数据类型是值传递,其他数据类型是引用传递。2.思路:整体翻转,然后各部分翻转。

2024-06-03 15:31:00 159

原创 算法训练营第二天|977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II 总结

确定循环不变量(区间定义)

2024-06-02 08:03:58 87

原创 算法训练营第一天|数组理论基础,704. 二分查找,27. 移除元素

确定循环不变量,即区间的定义是不变量。快指针:寻找新数组的元素。慢指针:指向要更新的位置。

2024-06-02 07:59:29 79

原创 算法训练营第七天|454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和 总结

两两构建时间复杂度最小,为n方。

2024-05-30 12:30:09 238

原创 算法训练营第六天 | 哈希表理论基础 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。因为我们查找的是元素,所以元素为key,下标为value。

2024-05-29 11:50:07 151

原创 哈希表理论基础

哈希表(散列表)是根据关键码的值而直接进行访问的数据结构。通过hashCode把名字转化为数值。

2024-05-27 21:22:47 216

原创 算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II 总结

1.虚拟头节点:链表的一大问题就是操作当前节点必须要找前一个节点才能操作。这就造成了,头结点的尴尬,因为头结点没有前一个节点了。每次对应头结点的情况都要单独处理,所以使用虚拟头结点的技巧,就可以解决这个问题。

2024-05-27 11:44:44 338

空空如也

空空如也

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

TA关注的人

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