代码随想录打卡
洒水水儿
码不停题
展开
-
代码随想录day34 Java版
本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了,跟上一题一样。sum += i;//初始化dp数组i++) {//采用倒序j--) {//两种情况,要么放,要么不放。原创 2024-03-12 23:41:53 · 189 阅读 · 0 评论 -
代码随想录day33 Java版
递推公式不好想,在根节点的左右组装,从dp[0]*dp[n-1]到dp[n-1]*dp[0]累加。原创 2024-03-11 10:39:00 · 205 阅读 · 0 评论 -
代码随想录day32 Java版
跟上一题相比多判断下障碍物,当前位置有障碍物就将这里的dp数组置0。原创 2024-03-10 22:32:44 · 244 阅读 · 0 评论 -
代码随想录day31 Java版
今天开始刷动态规划,先拿简单题练手。原创 2024-03-10 00:19:10 · 248 阅读 · 0 评论 -
代码随想录day30 Java版
贪心算法从倒数第二位开始向前遍历字符串,如果发现当前字符大于下一位字符,则将当前字符减一,并记录需要调整的起始位置。本质上还是二叉树的递归,使用后序遍历的方式处理二叉树的节点。对于每个节点,根据左右子节点的状态来确定自己的状态。位置开始,将后面的所有字符都置为字符'9',以确保满足单调递增的条件。中最后一个区间的结束位置为当前区间的结束位置和。中最后一个区间的结束位置,则将当前区间添加到。中最后一个区间的结束位置的较大值。为空,或者当前区间的起始位置大于。使用一个循环遍历所有区间。原创 2024-02-18 16:37:33 · 146 阅读 · 0 评论 -
代码随想录day29 Java版
在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。具体代码里统计每一个字符最后出现的位置,然后从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点。1:-1),Lambda表达式。,则返回1,否则返回-1。算法上把差不多位置的叠起来一起引爆,并对可以一起引爆的区间进行合并。原创 2024-02-18 15:31:43 · 304 阅读 · 0 评论 -
代码随想录day28 Java版
从左向右遍历所有学生,对于每个学生,如果其评分比左边的学生高,那么他应该比左边的学生获得更多糖果,因此糖果数量为左边学生的糖果数量加一;否则,糖果数量为1。来记录总剩余油量、当前剩余油量和起始加油站的索引。在遍历加油站数组的过程中,不断更新。小于0,说明从当前起点到当前加油站无法行驶,需要将起始加油站更新为下一个加油站(即。来分别记录每个学生左边和右边的糖果数量,然后计算总共需要的糖果数量。怎么又插了道简单题,像大一的机试,按照常识优先找回10块的。,它是一个一维数组,其中。为当前剩余油量,并根据。原创 2024-02-17 22:37:17 · 361 阅读 · 0 评论 -
代码随想录day27 Java版
i==cur的时候更新cur并进入下一次跳跃。记录能跳的最远范围,每次跳跃越远越好。代码中动态改变循环上界比较少见。简单题,每天都贪心即可。每次都牺牲值最小的即可。原创 2024-02-17 18:29:37 · 152 阅读 · 0 评论 -
代码随想录day26 Java版
今天开始刷贪心算法,新手保护期中爽得一批。原创 2024-02-17 15:37:10 · 185 阅读 · 0 评论 -
代码随想录day25 Java版
回溯好写,检查n皇后的代码之前没见过,比较像五子棋。感觉挺麻烦,需要记录映射关系来处理死循环问题。巨麻烦,要是面试遇到就认了。原创 2024-02-17 12:21:06 · 230 阅读 · 0 评论 -
代码随想录day24 Java版
HashSet 用于记录已经选择过的元素,确保同一层级中不会选择重复的元素。这样可以保证在回溯的过程中,只会选择不同的元素组合,避免产生重复的递增子序列。跟上一题相比,在每次循环中,如果当前元素与前一个元素相同且前一个元素未被使用过,则跳过当前元素,以避免生成重复的排列。梦开始的地方,最开始写回溯不会用标记数组,递归只是处理循环层数不确定的问题。加上标记数组就是剪枝了·原创 2024-02-17 11:44:50 · 185 阅读 · 0 评论 -
代码随想录day23 Java版
开幕雷击,感觉挺难的,需要把切割问题抽象为组合问题,还得设置切割过的地方不能重复切割,所以递归函数需要传入i + 1。模拟切割线,其实就是index是上一层已经确定了的分割线,i是这一层试图寻找的新分割线。这行代码,因为、在每一次递归调用中,都会先将当前的。和前一天的组合数去重一个套路,理解了树层去重和树枝去重。加入到结果集中,然后再进行下一层的递归搜索。时,for 循环条件不满足,递归就自然会结束。比较考字符串操作,回溯比较容易。原创 2024-02-14 00:25:31 · 219 阅读 · 0 评论 -
代码随想录day22 Java版
在套模板的基础上,手动按位置放一个映射表,每次独立处理字符,还要对空字符串单独处理(因为默认生成了StringBuilder是空字符串而不是null)此处for循环并不像之前从start开始遍历,因为本题每一个数字代表的是不同集合,也就是求不同集合之间的组合,而求组合问题是求同一个集合中的组合。candidates有重复元素,但还不能有重复的组合真的离谱,加一个数组来标记。这种复杂算法可以先把给的数组排序方便剪枝。原创 2024-02-13 21:15:23 · 143 阅读 · 0 评论 -
代码随想录day21 Java版
过完年开始刷回溯算法,寒假在家时间多点,争取每天多刷点题回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案。通常是解决复杂的题。回溯法解决的问题都可以抽象为树形结构,因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。原创 2024-02-12 17:01:01 · 178 阅读 · 0 评论 -
代码随想录day20 Java版
接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。由于递归函数有返回值,对于不在范围内的节点,可以通过左右孩子递归来实现修剪。注意这里二分采用左闭右开的写法,因此调用递归函数右边是nums.length。吸取了之前构造二叉树的经验,递归函数需要利用开始索引和结束索引。直接暴力做了,先求到总和,再按照中序遍历构建。看题解发现按照右中左顺序来遍历就可以了。最后返回root节点。原创 2024-02-09 17:58:26 · 145 阅读 · 0 评论 -
代码随想录day19 Java版
当找到这两个节点或者空时返回该节点,先进行左右递归,然后处理该节点:都找到时才返回该节点,因为是后序所以肯定返回最下层也就是最近的公共祖先,左右之一找不到时就说明,最近公共祖先是p和q中的一个,就返回另一边。在上一题的基础上加了二叉搜索树的条件,相当于二叉树变成了有序数组,因为公共祖先节点一定在p和q中间,所以大了就往左边找,小了就往右边找。跟上一题相比复杂一些,将删除节点的左孩子放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。在二叉搜索树中根本不用写遍历,直接根据值左右查找。原创 2024-02-09 16:33:07 · 186 阅读 · 0 评论 -
代码随想录day18 Java版
实现ArrayList转数组。跟上一题一样,遇到在二叉搜索树上求数值问题的题目,可以利用中序遍历把二叉搜索树转化为有序数组,再进行分析。前几天刚对比了下堆和二叉搜索树。堆是上下位置区分大小,二叉搜索树是左右位置区分大小。中序遍历下,输出的二叉搜索树节点的数值是从小到大的有序序列。将节点放到map中,找到最大出现次数并按照该值找到众数。这道题简单应用了二叉搜索树的查找功能,直接用前序遍历。原创 2024-02-07 22:27:37 · 151 阅读 · 0 评论 -
代码随想录day17 Java版 二叉树部分
手算很容易,实现很困难的题目。思路是用后序确定根节点,再用中序切分。具体切分过程比较像快速排序的左右区间切分(因为中序序列有根节点切分左右子树),也很自然地用到递归。那么递归结束条件为区间扫描完毕,然后找到后序遍历的最后一个元素在中序遍历中的位置,保存中序左子树个数,用来确定后序数列的个数。原创 2024-02-07 00:13:06 · 148 阅读 · 0 评论 -
代码随想录day16 Java版 二叉树部分
这个题看似跟之前找所有路径的题目很像,但做起来发现简单很多,因为不用回溯。最后sum需要把当前节点和左右部分的和加上并向上return来实现累加。这题显然需要层序遍历来确定最后一层,当层的第一个节点就是最左边的节点。这种找累加和的处理可以一直减,然后跟一个现成的0来比较。由于要在遍历所有左叶子之后返回总和,因此需要后序遍历。感觉就是遍历,遇到叶子结点就累加,试了下居然过了。由于从根节点往下遍历到叶子,采用前序遍历。原创 2024-02-04 23:50:19 · 253 阅读 · 0 评论 -
代码随想录day15 Java版 二叉树部分
3.递归部分:采用后序遍历,先左右分别判断子树有没有-1标记,再对当前节点判断是否平衡,如果不平衡就return -1, 平衡就return节点的真实高度。前序遍历中先把当前值加入path,当不是叶子结点时,在左右遍历的时候递归完进行回溯。深度是到根节点的距离 ,向下增长,用前序遍历递归一直向下走。高度是到叶子结点的距离,向上增长,用后序遍历来向上返回递归结果。2.终止条件:传入的节点为空,此时高度为0,return 0。但看了题解,如果判断子树为满二叉树,可以直接套公式。1.传入节点,返回高度。原创 2024-02-04 00:18:26 · 319 阅读 · 0 评论 -
代码随想录day14 Java版 二叉树部分
今天开始刷二叉树的题目,发现大多数都是在昨天的遍历的基础上的变式。原创 2024-02-02 22:47:31 · 260 阅读 · 1 评论 -
代码随想录day13 Java版 二叉树部分-遍历全解
回顾了递归的套路:1.返回值+传入参数2.结束条件3.写具体的每一个递归单位而在二叉树的三种遍历都没有返回值,传入当前node节点和所给框架下的返回值数组res当传入的节点是null时结束递归每个递归单位包含输出当前节点+递归左孩子+递归右孩子,改变输出的位置即可实现三种遍历。原创 2024-02-01 21:47:36 · 331 阅读 · 0 评论 -
代码随想录day12 Java版
今天解决队列和栈的题,期待后面狠狠搞二叉树(之前面试被刺了TT)原创 2024-01-28 21:05:07 · 416 阅读 · 0 评论 -
代码随想录day11 Java版
经典用栈处理括号匹配的问题,虽然但是中缀表达式什么的没考,就直接处理三种括号不匹配的情况(左括号更多,右括号更多,左右不一样)就好了。只要知道栈和队列的结构,用第一个栈模拟时发现能入队但出队时顺序相反了,正好利用栈能翻转输出顺序的特性,创建另一个栈用于输出。注意代码实现中,出队时如果out栈空,需要把所有in栈的元素压入out栈来维护顺序。模拟入栈后发现出栈时没办法弹出队尾来实现,只能先把前面的元素都出队后才能弹出该元素。其中栈的方法主要有push,pop,peek,empty,队列的方法可以看下图。原创 2024-01-20 17:31:02 · 394 阅读 · 0 评论 -
代码随想录day10 Java版
今天进入双指针环节,由于题目都做过,所以选三题来复习。原创 2024-01-08 18:40:43 · 393 阅读 · 0 评论 -
代码随想录day9 Java版
前缀表是用来回退的,当前位置匹配失败,会找到之前已经匹配上的位置,再重新匹配,此也意味着在某个字符失配时,前缀表会告诉你下一步匹配中,模式串应该跳到哪个位置。String和StringBuilder都有substring方法,一个参数时该参数表示开始位置(包含),两个参数时第一个参数表示开始位置,第二个参数表示结束位置,左闭右开。下面开始用KMP来优化,这样当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配来实现优化。leetcode完整代码。原创 2024-01-06 16:13:40 · 381 阅读 · 0 评论 -
代码随想录day8 Java版
跟之前的反转字符串一样使用双指针,外层循环以2k为单位,并对于最后一段进行长度处理。原创 2023-12-31 20:59:09 · 335 阅读 · 0 评论 -
代码随想录day7 Java版
这类n数之和如果用双指针的话,先n-2层for循环nums[i] + nums[j]+......为确定值,然后再用一层左右指针遍历,实现n-1次方的时间复杂度。顺便查了下数组和集合可以分别调用Arrays和Collections的静态方法reverse。强行用哈希表的做法,类似前面的四数相加,这道题最麻烦的就是处理重复和ijk不相等。类似刚刚的三数之和,发现去重剪枝太难了,放弃哈希开始双指针。对于内容去重可以将元素排序后放到HashSet里面。哈希表刷完来道练手题,就是实现reverse。原创 2023-12-30 11:37:28 · 306 阅读 · 0 评论 -
代码随想录day6 Java版
刚面试完痛定思痛,开始肝哈希表第二天。原创 2023-12-29 16:52:51 · 416 阅读 · 1 评论 -
代码随想录day5 Java版
今天开始写用哈希表的题目,当我们遇到了要的时候,就要考虑使用哈希表空间换时间。原创 2023-12-27 19:41:11 · 366 阅读 · 1 评论 -
代码随想录day4 Java版
圣诞节🎅,但是得投暑期实习,被迫继续写链表题>_原创 2023-12-25 16:28:55 · 365 阅读 · 0 评论 -
代码随想录day3 Java版
一定注意拿到指针后每次判断都要看看现在是不是空指针,好像很容易踩坑。原创 2023-12-24 23:48:03 · 345 阅读 · 1 评论 -
代码随想录day2 Java版
因为数组本身有序,因此最大值只出现在两端,想到左右指针。原创 2023-12-24 16:59:06 · 396 阅读 · 1 评论 -
代码随想录day1 Java版
搞懂了边界值的处理问题:[left,right]区间中left和right为循环不变量,因为left可以等于right,所以while判断中为原创 2023-12-19 21:05:58 · 343 阅读 · 1 评论