- 博客(43)
- 收藏
- 关注
原创 代码随想录算法训练营第四十五天 | 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数
我们不是仅仅就走2个,或个3个,而是我们一步可以走一个,两个,3个,4个,一直到m个,这个时候我们,并且到达每个台阶都可以走1-m个台阶,这个时候就需要利用完全背包;3,初始化,第一个肯定不能为0,因为后面的是由前面的推出来的,如果dp[0] = 0,那么后面的全为0;这道题我们是求排列,因为先走1个台阶,再走2个台阶到楼顶和先走2个台阶,再走一个台阶到楼顶是不一样的,所以我们求的是排列;求装满背包有多少方法,我们用的是dp[j] += dp[j - nums[i]];1,确定dp的含义;
2023-09-20 13:10:12
306
原创 代码随想录算法训练营第四十四天 |完全背包● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ
【代码】代码随想录算法训练营第四十四天 |完全背包● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ。
2023-09-19 20:53:25
276
原创 代码随想录算法训练营第四十三天 | ● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零
这道题我们可以理解为,我们尽量把这堆石头分成两堆重量尽量相同的石头堆;然后我们从这个数组中任意寻找石头,求得容量为数组值一般的石头堆的最大值。因为这道题是0,1背包,我们用过了一个石头就不能使用了;dp[j] 是容量为j的石头堆最大的值为dp[j];1,确定dp数组的含义,下标的含义;5,打印dp数组(用来debug)直接使用0,1背包的知识就可以了;我们要知道动态规划的五部曲;3,确定dp数组如何初始化;这题是组合问题,挺难的;
2023-09-19 20:44:07
241
原创 代码随想录算法训练营第四十二天 | 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集
总结:太难了,但是还好有卡哥的讲解哈哈,今天上的javaweb课我服了,老师真差劲,哎,看来二本的师资资源还是太差了;我感觉以后我讲的都比他好;
2023-09-05 21:41:02
157
原创 代码随想录算法训练营第四十一天 | ● 343. 整数拆分 ● 96.不同的二叉搜索树
昨天晚上过了一遍单词;今日打卡完成;上午上了软件工程的课;又学了一些计组,哎,还要补考啊;一会完成一下作业;
2023-09-04 18:22:38
159
原创 代码随想录算法训练营第三十九天 |● 62.不同路径 ● 63. 不同路径 II
昨天晚上没有做什么,今天做了两道动态规划的题,上午背了一下单词,下午去买了一辆自行车;呜呜呜没钱了;
2023-09-02 18:10:46
331
原创 代码随想录算法训练营第三十八天 | ● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯
昨天下午学了一会计组,但是晚上没有学,想要淘一个二手自行车,今天开始动态规划的入门,背了一个小时的英语单词;
2023-09-01 14:19:59
154
原创 代码随想录算法训练营第三十七天 | ● 738.单调递增的数字 ● 9 总结
整形转为字符串形式————第一种方法:我们把一个整形的数转化为一个字符串型的时候我们可以直接加上"" 如n + "" 这样n就变为字符串形式的了;第二种方法:使用库函数String.valueOf(n),这样n就由整形转换为字符串形式;字符串转化为字符串数组————使用字符串库函数,split 如str.split("") 此时str由字符串转变为字符串数组;字符数组转化为整数,可以直接使用库函数Integer.parseInt(String.valueOf(chars));
2023-08-31 16:10:42
87
原创 代码随想录算法训练营第三十六天 | ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间
看完代码随想录之后的想法:这道题和昨天的射气球是一样的,只不过我们的思考背景是不同的;我们先进行排序,然后我们找到重复范围的时候进行count++,同时我们取最小值作为下一次进行比较的边界,为什么取最小值作为我们下次比较的边界呢,因为我们这样我们才可以使下一个区间尽量不与上一个区间接触;如果第i个区间的左边界>=上一个区间的有边界,说明这两个区间不重叠,我们什么都不做else 我们用count++,用来记录需要删除的区间个数,同时我们要更新区间的最小值;intervals[i][1] = Math.min(
2023-08-30 15:53:10
147
原创 代码随想录算法训练营第三十五天 | ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
今天学习了一些贪心基础算法,背了半小时代码,学习了一些计组;加油。
2023-08-29 16:11:33
117
原创 代码随想录算法训练营第三十四天 | 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果
这是我们需要一个cur便变量记录我们起始位置,sum记录油箱里的油的数量,如果sum < 0的时候,意味着,这个cur不适合为起点,我们更新起点为当前的下标+1,从新计算sum(sum归零从新计算);因为在旧的cur到新的cur之间,都不可以作为新的起点,具体讲解可以看卡哥的讲解;我们利用贪心的方法,因为我们算一个小孩的糖果数量,需要判断这个小孩左边的,同时还需要判断这个小孩的右边,我们无法判断,因此我们需要贪心的方法;这道题使用贪心的方法,我们首先把最小的负数改变,然后剩余的次数反复改变最小的数;
2023-08-28 16:55:05
55
原创 代码随想录算法训练营第二十三天 | ● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树
2:递归构造左子树;我们需要接受返回的左子树的根节点;3:递归构造右子树;我们需要接受返回的右子树的根节点;终止条件left > right;构造二叉树我们使用中序遍历;
2023-08-26 15:45:51
115
原创 代码随想录算法训练营第三十二天 | 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II
我们从第一个数开始,我们求的它的下标+它的值,就是它可以走的最大距离,也就是说到最大距离中间的位置都可以达到,也就是覆盖范围,我们再从覆盖范围中访问每一下标,更新最远的距离;如果最远距离>=nums.length - 1;这道题在覆盖范围内,我们寻找每一个位置能达到的最远的地方然后比较出最大的距离我们,这个时候我们更新覆盖范围;直到最远的距离>=nums.length - 1;122.买卖股票的最佳时机II。
2023-08-26 13:26:20
172
原创 代码随想录算法训练营第二十二天 | 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
我们插入入的节点都在叶子节点,因此,我们的终止条件是在root == null 的时候插入新节点同时终止递归;我们的返回值是TreeNode ,参数是TreeNode, val;第四种:需要删除的节点左节点不为空,右节点为空;如果val > root.val 我们右递归;第三种:需要删除的节点左节点为空,右节点不为空。我们删除节点右5种情况;第五种:需要删除的节点左右节点都不为空;第二种:需要删除的节点左右节点为空;第一种:没有找到需要删除的节点;还是不好理解的,今后继续做;我们不需要处理中间节点;
2023-08-25 17:06:28
60
原创 代码随想录算法训练营第三十一天 | ● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和
但是如果是上下有平坡的时候也是有一个摆动,我们可以选择平坡最后一个数作为摆动,这个时候需要满足(prediff = 0 && curdiff > 0) || (prediff = 0 && curdiff < 0)我们使用sum 来记录子序列的和,如果sum < 0 的话,那么我们在加上下一位的时候,我们只会让下一位数变小,因此我们sum < 0 的时候,我们把sum 归0, 那么我们加下一个数的时候,就是全新的开始;因此我们求首节点我们需要在首节点加上一个平坡,求尾节点我们不用访问,直接加上一即可;
2023-08-25 14:35:00
77
原创 代码随想录算法训练营第二十一天 |530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先
不过我们需要注意pre 的初始值,我们第一次开始比较是从左叶子节点开始的,因此pre == null;我们比较cur.val 和 pre.val 之后,我们需要更新pre = cur;我们需要使用双指针的方法来解决;pre表示当前节点的前一个;501.二叉搜索树中的众数。cur表示当前的节点;
2023-08-24 20:14:28
60
原创 代码随想录算法训练营第二十天| ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树
文章讲解:构造二叉树我们需要使用前序遍历,终止条件可以为,我们数组中只有一个数,也就是一个数构造一个二叉树,因此我们把这个数构造成一个节点然后return就可以了;我们进行左子树遍历时我们要保证至少有一个数,因为我们的终止条件就是只有一个数才可以截至;也就是index > start;同理右子树也是index < end - 1。
2023-08-23 20:28:53
61
原创 代码随想录算法训练营第二十九天|* 491.递增子序列* 46.全排列* 47.全排列 II
for,我们要注意,在递归的时候我们需要跳过的是已经使用过的数,然而该数前和后面的数依旧可以使用;我们需要使用used数组来标记我们之前使用过的数;我们在进行树层去重的时候,我们对于每一次for循环,我们需要新建一个set,记录每一层出现过的数,如果出现过的话,后面就不能再使用了;首先使用全排列的基本方法,不过我们需要进行去重,那么我们首先需要对数组进行排序;终止条件 path.size() == nums.length;我们需要注意,我们回溯三部曲。
2023-08-23 16:15:55
71
原创 代码随想录算法训练营第十八天| 513.找树左下角的值● 112. 路径总和 113.路径总和ii● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
使用前中后序都可以我们需要求每一个叶子节点深度,然后与maxdepth相比,如果叶子节点的深度大于maxdepth,我们就更新result,maxdepth也需要更新;我们求叶子节点的深度时,我们需要一个变量depth,再往下递归时depth会加1;但是depth需要回溯。
2023-08-22 20:51:17
45
原创 代码随想录算法训练营第二十八天| ● 93.复原IP地址 ● 78.子集 ● 90.子集II
在用暴力解法解决移除元素时,一开始没想到用size当作数组的长度,因此,一直为为最后一个数值是val苦恼,最后想到用-1代替最后的数值,也算是解决了问题;在树中,有树层去重;我们只需要树层去重,那么为了避免树枝去重,我们需要used[] 数组标记那个元素访问过;我们用startIndex 到 i 这个一个ip段;我们判断是否符合,如果不符合就break,如果符合就递归;这道题,我们需要注意result的位置就可以了;我们用一个参数pointsum 控制递归;然后按照回溯三部曲进行就可以了;
2023-08-22 16:16:01
99
原创 代码随想录算法训练营第十七天| ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和 。
最后一个题,挺不好想的,我们如何处理左叶子,因为左叶子是在递归结束的时候哦,因此,我们可以放到左递归后面,进行处理;的时候,我们会一直递归到叶子节点,这个时候我们会返回0;因为叶子节点的左子树左叶子之和加上右子树左叶子之和为0;我们需要先判断是否是叶子节点,但是我们无法通过叶子节点判断是否是左叶子节点;如果左右节点返回的是-1 ,说明已经不是平衡了,那我们只需要向上返回-1;因为我们执行到了叶子节点,我们就可以判断是否是左叶子,如果是的话。我们需要求出每个节点的高度,然后我们需要判断左右节点的高度;
2023-08-21 20:42:33
61
原创 代码随想录算法训练营第二十七天| 39. 组合总和● 40.组合总和II● 131.分割回文串
我们需要使用used 数组,当我们每次处理一个数,把这个数标记已经访问,下一数访问的时候,,就可以跳过,进行下一个操作;startIndex 到 i ,这是一个字串,我们需要判断该字串是不是一个回文串;如果不是,我们没有必要继续往下深度递归了,我们就跳过,我们需要横向判断下一个字串是否是回文串;当然,卡哥说在判断是否是回文串的时候,可以使用动态规划,tmd,真不会哈哈。我们要注意去重,我们不需要对树枝去重,因为树枝中的数并不是重复利用了。每一次选一个数, sum + candidates[i];
2023-08-21 17:21:43
99
1
原创 代码随想录算法训练营第十六天| 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
返回值代表节点的高度,求出左节点,右节点的高度后,取最大值然后 加上节点本身的深度+1;当节点的左节点为空右不为空,我们以右节点的深度 + 1为准;当节点的右节点为空左不为空,我们以左节点的深度 + 1为准;当左右节点都不为空,我们返回两者之间最小的 + 1;使用后序遍历,不过在处理的时候要注意一下。当节点的左右节点为空,我们返回1;可以使用求普通二叉树节点的个数;再加上本身节点的个数1;根据完全二叉树的特征,先求左子树节点的数量;再求右子树节点的数量;使用后序遍历的方法,但是卡哥的方法很妙;
2023-08-20 19:57:26
118
1
原创 代码随想录算法训练营第二十四天| ● 理论基础 ● 77. 组合
使用回溯的模板来解决问题,不过我们需要小心一下for循环里面元素集合的范围,我们注意for循环里面元素开始时不确定的,因此我们需要使用一个startIndex来确定元素开始的值;同时我们需要做一下剪枝,例如我们需要找到5个数,但是我们path里面有了1个元素,然而如果我们下一个元素选择最后一个元素,肯定不可以凑够5个,因此我们需要剪枝,path里面已经有path.size()个,我们还需要k - path.size() 个数,那么我们我们的元素至多到 n - (k - path.size()) + 1;
2023-08-20 15:06:31
179
1
原创 代码随想录算法训练营第十五天|层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树
使用后序遍历,通过使用后序遍历,我们可以先对左右子书进行判断,如果左右子节点满足条件的话,这个节点就满足条件;对于一个节点,我们先对它进行左右节点的交换,然后再对它的左右子节点进行单独递归操作;可以使用前序和后序解决,中序比较麻烦。对子节点进行操作,使用后序遍历。递归三部曲,参数,返回值。
2023-08-19 16:08:39
133
原创 代码随想录算法训练营第25天| 216.组合总和III● 17.电话号码的字母组合。
第二步 终止条件 //当path的值等于k,说明已经选好k个数,就可以结束递归了同时判断是否满足条件,满足条件放入result 链表中 return;:依旧使用递归 + 回溯的方法,for 循环是 每一次选一个然后递归选下一位,递归结束,回溯,然后选下一个;假如我们就选2个数,我们可以只用两个for循环,每次循环选择一个数,两次循环选择两个数,假如我们就选3个数,我们可以只用三个for循环,每次循环选择一个数,三次循环选择三个数,首先回溯三部曲,第一步,参数,和 返回值;第三步 单次循环的过程;
2023-08-19 14:33:15
167
原创 代码随想录算法训练营第十一天 | ● 20. 有效的括号● 1047. 删除字符串中的所有相邻重复项● 150. 逆波兰表达式求值●总结
题目链接:● 20. 有效的括号
2023-08-05 15:51:58
131
1
原创 子类继承父类的时候,属性继承了没?
子类会继承父类的所有属性和方法,包括属性的set,get方法;不过我们要注意父类属性的访问权限,如果是public,我们可以直接访问属性;如果是private,我们需要set,get方法才能访问属性;例如在父类中写了name属性,子类中没有写name属性,难道我们子类真的没有吗,不依旧有name属性,不过我们需要判断属性访问权限,看看是否需要set,get方法注意,如果没有对子类属性赋值,会沿用父类的值;
2023-08-04 21:03:10
284
1
原创 代码随想录算法训练营第十天 | ● 理论基础● 232.用栈实现队列● 225. 用队列实现栈● 总结
因为栈并不是我们像数组一样是一个很底层的结构,我感觉栈就像合成怪一样,它本身并不想数组,这么独立性,更像是利用更加底层结构的这样那样的方法,然后合成一个具有很多很实用的方法的一个类,然后我们就使用这个类的方法做这样那样的工作,我们给这个类起一个名字,我们称之为栈,同理,队列也是一样的道理;我们因此只需要使用两个栈去完美实现队列的方法就可以了;我们只要使用一些结构去合成队列所具备的方法就可以;因此我们可以使用两个栈去合成队列;使用两个队列实现栈的功能;使用一个队列实现栈的功能;
2023-08-04 14:26:46
98
1
原创 代码随想录算法训练营第九天| ●28. 实现 strStr()●459.重复的子字符串●字符串总结 ●双指针回顾
aabaaf,当遇到f的时候,会发生不匹配,因此,我们需要找到前一个字符的next值,姑且记录为k,然后从字符串第k位继续判断,直到找到匹配的字符串,或者,遍历完之后还是发现没有匹配的。先看代码随想录关于kmp第一个的视频,然后引出next数组,这个时候我们先看刚刚的博主对next数组的求法的讲解,然后再看代码随想录kmp的第二个视频;在这里,next是最长相等前后缀,我们要先求出整个字符串的每一个字串(包括第一个字符)所对应的最长相等前后缀,在这里就不解释前后缀的意义了;使用kmp,如何进行匹配,
2023-08-03 16:41:45
106
原创 代码随想录算法训练营第六天 | ● 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字 总结
进行判断,如果i + k < size 的时候,我们会发现我们需要对 i 到 i + k 进行反转,否则 我们需要对i 到 size 进行反转,每次在i 到 i + 2k处理完毕后,我们就需要i向后移动2k,来进行下一次的操作,直到i出界;当然,反转字符串的操作可以直接调用库函数,因为我们自己写的反转函数和库函数的功能一样,对于这种基本的函数,我们在熟悉掌握的时候直接可以进行调用;这道题,进行反转的时候,我们仅仅对于for进行操作就行,对i + k。然后在反转整个字符串,然后再反转每一个单词;
2023-08-02 23:58:01
64
原创 Eclipse 和 Tomcat 整合
注意下面第三步操作之前,如图,我已经绑定jdk了,我们可以选中jdk,点击右侧remove就可以把原来的jdk去掉,然后再点击add,绑定新的jdk了。输入:localhost:8080成功打开网页,说明整合成功,(注意,打开网页时,不要关闭tomcat,否则进不去)我们选择第二个use后,默认的将我们今后开发的web应用程序发布到tomcat所安装的目录下;点击Directory,然后找到自己下载的jdk,就可以,下图是我的jdk路径。图五:选择Apache安装的路径;图二:点击Apache;
2023-08-01 20:12:50
1253
1
原创 代码随想录算法训练营第六天 | ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和 总结
使用数组,每一次把第一个字符串放入数组,并且记录一下出现的个数,然后遍历另一个字符串,每一次都把该字符相应的次数减一,如果发现到最后,数组当中存在大于零的数,就return false。当时直接想出来了,用的是双指针,数组先排序,定一个数,然后双指针不断调整,和小的话,左指针右移,大的话,右指针左移,等于的话满足条件。很容易忘记去重,我们在去重的时候,如果有重复的时候,一定先让第一个执行完后,然后跳过后面重复的,这样才能够避免漏掉的情况;今天学到了剪枝操作,同时要注意溢出的问题;454.四数相加II。
2023-08-01 12:06:25
183
1
原创 代码随想录算法训练营第五天 | ● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和 总结
今天学习到了哈希表的原理,就是对一个元素,通过一个哈希函数进行一对一的映射,就相当于该元素映射成为了一个索引,我们访问数组的时候,我们是通过索引直接可以访问到了相对应的值,因此我们哈希也就可以通过元素映射成索引直接访问到该元素所对应的值;但是我们要注意set.find()这个函数时间复杂度为log(n);
2023-07-31 15:01:52
70
1
原创 代码随想录算法训练营第四天 | ● 24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II
直接使用双指针解决就可以,fast移动n+1位之后,slow和fast一起向右移动,直到fast为null,但是我们注意到,如果删除头结点的时候,我们找不到前驱,需要特殊进行处理,因此我们直接使用虚拟节点,同时题目的n是不会超过链表的长度,因此,如果超过链表的长度的时候,我们可以先让fast移动n位,然后判断此时fast是否为空,如果为空直接返回head,如果不为空fast在移动一位然后slow和fast一起向右移动,直到fast为空;看是看得懂,但是自己想的时候却想不出来,不知道为甚么,蓝瘦,香菇;
2023-07-29 18:39:22
85
原创 代码随想录算法训练营第三天 | ● 链表理论基础 ● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表 ,总结
是创建了一个指针,因为没有构造方法,所以不可能是创建节点,也就是说,创建节点,需要构造方法,因此p和head 都指向了头节点;
2023-07-28 18:13:20
83
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人