Algorithm practice
文章平均质量分 76
代码随想录训练营日志
just_sleeeeep
24fall ucd csc
转码新人,欢迎大家私信指导!感激不尽。
近期目标:7.17-10.17 紧跟代码随想录节奏打卡算法题。
Spring+Spring Boot学习(Spring boot面试题刷题)
展开
-
day13 二叉树-基础+递归遍历+迭代遍历+统一迭代+层序遍历
如果节点为空了,则将节点数字存入数组,节点数字更新为栈的出口第一个数字(弹出第一个数字),再将节点更新为右叶子。层序遍历 (Level-order Traversal): Level-order Traversal 或 Breadth-First Traversal (BFT)这包括前序遍历(Preorder Traversal)、中序遍历(Inorder Traversal)和后序遍历(Postorder Traversal)。这种遍历方式首先访问根节点,然后遍历左子树,接着遍历右子树,逐层进行。原创 2024-07-30 15:48:49 · 306 阅读 · 0 评论 -
day36+day37 0-1背包
小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料只能选择一次,并且只有选与不选两种选择,不能进行切割。通过这道题目,大家先粗略了解, 01背包,完全背包,多重背包的区别,不过不用细扣,因为后面 对于 完全背包,多重背包 还有单独讲解。`dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。dp`[i][j] 装满i个0,j个1的背包最多有dp[i][j]个物品。任取物品0、物品1放入容量为4的背包中,最大价值是`dp[1][4]。原创 2024-09-18 02:48:24 · 418 阅读 · 0 评论 -
day23 回溯算法-sum1+sum2+PalindromePartitioning
candidates[i-1] == candidates[i] && used[i-1] == 0意味着前一位重复元素之前没有在同一层遍历上使用过,这种情况需要做去重。直接continue,不处理后面的数据即可。//将上面的if(sum > target) return;替换为这句以后,代码效率大大提高了。本题重点在于数层去重。通过长度和candidates一致的used数组实现,用过的数组标为1,没用过的元素位置是0。//这里允许元素重复,所以无需i++去重:数层去重/树枝去重。原创 2024-08-09 20:57:17 · 88 阅读 · 0 评论 -
day25 回溯算法-必做题(递增子序列+全排列*2)+选做题没做下次一定(重新安排行程+N皇后+解数独)
因为 一刷 也不求大家能把这么难的问题解决,大家目前能了解一下题目的要求,了解一下解题思路,不求能直接写出代码,先大概熟悉一下这些题,二刷的时候,随着对回溯算法的深入理解,再去解决如下三题。N皇后这道题目还是很经典的,一刷的录友们建议看看视频了解了解大体思路 就可以 (如果没时间本次就直接跳过) ,先有个印象,二刷的时候重点解决。同样,一刷的录友们建议看看视频了解了解大体思路(如果没时间本次就直接跳过),先有个印象,二刷的时候重点解决。本题很难,一刷的录友刷起来 比较费力,可以留给二刷的时候再去解决。原创 2024-08-12 13:01:16 · 446 阅读 · 0 评论 -
day28 贪心算法-股票+jumpGame+negation(学会了给数组按绝对值大小排序)
由于排序后的流是Stream`<Integer>(即元素类型为Integer),而你可能需要的是一个整数数组(int[]),因此这里使用mapToInt(Integer::intValue)将Stream<Integer>中的每个Integer对象转换回基本类型int,并得到一个IntStream。这段代码是Java中的一段流(Stream)操作,用于对整数数组nums进行排序,但排序的方式不是基于数字的自然顺序(即从小到大),而是基于它们的绝对值的降序排序。怎么到终点的不重要,关键看最大覆盖范围。原创 2024-08-13 21:12:13 · 352 阅读 · 0 评论 -
day18 二叉树-minAbosoluteDiff+modeInBST+lowestCommonAncestor
/当这个数字出现频率比最大频率高时,清空list,增加新元素。原创 2024-08-03 22:11:13 · 114 阅读 · 0 评论 -
day27 贪心算法-基础+发饼干+摆动序列+最大子序和
删除单调坡上的元素。操作上遇到摆动就++即可。//头节点算上,不遍历它。2.首尾元素:虚拟头节点+默认尾部有摆动。用大饼干满足大馋孩子/用小饼干满足小孩子。核心:通过局部最优达到全局最优。当连续和是负数的时候,就抛弃。原创 2024-08-12 21:14:13 · 349 阅读 · 0 评论 -
day31 贪心算法-mergeIntervals+monotoneIncreasingDigits+binaryTreeCameras
/ 如果左右节点都覆盖了的话, 那么本节点的状态就应该是无覆盖,没有摄像头。碰到叶子节点,就让它的父节点放一个摄像头;这题的巧妙之处在于,找到第一个非单调递增的数字后,将它-1,后面的数字都改为9.//左右节点存在无覆盖状态,那 根节点此时应该放一个摄像头。//当头节点没有被覆盖,需要将一个头布置在头结点上。1.左右孩子都有覆盖(2),父节点则无覆盖。//根节点不布置摄像头,直接返回有覆盖。// } //没有区别,写法不一样。3.左右孩子有一个有摄像头,父节点有覆盖。原创 2024-08-20 20:29:01 · 1056 阅读 · 0 评论 -
day16 二叉树-左下角+路径SumTarget+由后序中序遍历构建二叉树(难难难)
/如何判断节点是最左节点?最大深度会由左叶子确定,后序再有相同深度的新的右叶子,也没办法进入if(depth > this.depth)循环了。//中序遍历数组从midPosition+1开始,因为midPosition的node已经被记录了。第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)//用中序遍历得到的左子树的节点个数去定位后序遍历左子树的节点。// 如果是叶子节点,并且路径和为0,则返回true。//中序遍历:左中右,后序遍历:左右中。原创 2024-08-01 18:05:11 · 324 阅读 · 0 评论 -
day32 动态规划-FibonacciNumber+climbingStairs+minCostClimbing
5.打印dp数组(动态规划代码简短,直接看打印出来的dp数组是不是和自己设想的一致)5.打印dp数组(动态规划代码简短,直接看打印出来的dp数组是不是和自己设想的一致)5.打印dp数组(动态规划代码简短,直接看打印出来的dp数组是不是和自己设想的一致)如果没做过动态规划的题目,看我讲的理论基础,会有感觉 是不是简单题想复杂了?其实并没有,我讲的理论基础内容,在动规章节所有题目都有运用,所以很重要!其中有3种办法迈到三阶,两种办法迈到2阶。`dp[i] :由dp[i-1] 跳一次/由dp[i-2] 跳两次。原创 2024-08-22 16:15:03 · 679 阅读 · 0 评论 -
day24 回溯算法-ip+subsets*2
/used[i-1] == 0意味着前一位重复元素之前没有在同一层遍历上使用过,这种情况需要做去重。直接continue,不处理后面的数据即可。原创 2024-08-11 15:50:36 · 401 阅读 · 0 评论 -
day15 二叉树-递归法纯享四题(height-banlanced BT, BT Paths, Left leaves count, nodes count)
但是,需要注意的是,如果 x 是负数或者 n 太大导致结果超出 int 或其他整数类型的表示范围,那么结果可能会是意外的。此外,如果 n 是负数,那么左移操作的行为是未定义的(Undefined Behavior, UB),在Java中通常会导致 ArithmeticException,但在实际的JVM实现中,可能会抛出不同的异常或者表现出不同的行为。在二进制中,2 表示为 10(最右边的位是最低位,也就是 2^0 的位置,左边是 2^1 的位置,依此类推)。所以,(2<<5) 的结果是 32。原创 2024-07-31 21:53:07 · 362 阅读 · 0 评论 -
day17 二叉树-maximumBT+mergeBT+BSTSearching+BSTValidate
/保存每一层的结果。//要记得把添加过的元素弹出!//无论是在遍历左子树还是右子树时,如果是二叉搜索树,将会优先遍历小数值的节点。这个是精简版的代码。省去了构造左子树和右子树数组的过程,代码效率提高。//用于保存上一个节点。//中:找到最大值后,将最大值设为根节点。//题目中说了数组元素是大于0的。//前序遍历,中左右。原创 2024-08-03 22:09:49 · 551 阅读 · 0 评论 -
day21 二叉树-BSTTriming +sortedArrayToBST+BSTToGreaterTree
/保存每一层的结果。//要记得把添加过的元素弹出!代码不复杂,但是很考察对二叉树结构的了解程度。也是在终止语句中写执行语句(即trim操作)。不断中间分割,然后递归处理左区间,右区间,也可以说是分治。//将节点返回根节点。原创 2024-08-06 20:50:25 · 867 阅读 · 0 评论 -
day30 贪心算法-burstBallon+nonOverlappingIntervals+partitionLabels
具体来说,-2147483648 - 2147483647 会导致溢出,因为 -2147483648 已经是 int 类型能表示的最小值,再减去任何正数都会导致溢出。判断重叠:如果一个气球的左边界小于等于前一个气球的右边界,则重叠。如果下一个气球的左边界没有大于等于此气球更新后的右边界,那么就不重叠。//将当前气球的右边界更新为当前气球和前一个气球右边界的最小值。判断不重叠:如果一个气球的左边界大于前一个气球的右边界,则不重叠,需要多一条弓箭。//当前气球的左边界小于等于上一个气球的右边界,则重叠。原创 2024-08-19 19:58:23 · 1056 阅读 · 0 评论 -
day34 动态规划-uniquePaths+uniquePath2+integerBreak+uniqueBinarySearchTrees
/这次不可以简单地这样剪枝了,因为这其中可能有障碍,那最后还是0。答:如果最后一个是障碍物,那直接返回0即可。//这里初始化二维数组一定要把第二个维度也初始化,否则无法初始化dp。本题思路并不容易想,一刷建议可以跳过。如果学有余力,可以看视频理解一波。本题思路并不容易想,一刷建议可以跳过。如果学有余力,可以看视频理解一波。1.二维数组初始化一整行/一整列:for循环遍历。96..不同的二叉搜索树 (可跳过)343. 整数拆分 (可跳过)原创 2024-08-23 17:41:07 · 913 阅读 · 0 评论 -
day20 二叉树-lowestCommonAacestorInBST+insert+delete
/ //如果当前节点的值同时大于p和q的值,那么就向左遍历,去寻找共同祖先。// //如果当前节点的值同时小于p和q的值,那么就向右遍历,去寻找共同祖先。// //当前节点的值在p和q之间,直接return。//如果传入的节点不为空,则直接返回当前节点到上一层。//如果当前节点的值大于待插入值,则向左寻找。//如果当前节点的值小于待插入值,则向右寻找。//5.待删节点左不空、右不空(最复杂,删节点7)//3.待删节点左不空、右空。原创 2024-08-06 20:41:51 · 526 阅读 · 0 评论 -
day29 贪心算法-gasStation+candy+lemonadeChange+queueReconstruction
i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。情况二:rest`[i] = gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。//从左到右遍历,如果右边的孩子比左边的孩子得分高,则让右边的孩子多吃一块糖。//从当前节点的后一个再开始计算。原创 2024-08-15 17:03:25 · 832 阅读 · 0 评论 -
day22 回溯算法-简介+combinations*2+phoneNumCombination
如果你在回溯算法中没有将 path 转换成 ArrayList 就直接添加到了 result 中,并且最终发现 result 中包含的是空的 path,这通常是因为在回溯过程中,path 被后续的操作修改或重置了,而 result 中存储的是对 path 的引用,而不是 path 的一个独立副本。保证解的独立性:通过将path转换为ArrayList并添加到result中,我们实际上是创建了一个path的快照,这个快照包含了找到解时的状态,而后续对path的修改不会影响到这个快照。那就是10-3+1=8。原创 2024-08-08 17:42:13 · 347 阅读 · 0 评论 -
day14 二叉树-翻转二叉树+对称二叉树+二叉树的最大深度+二叉树的最小深度是(用递归)
其中后序最简洁,因为省去了判断节点左和右是否为空的冗余代码。>深度:二叉树中任意一个节点到根节点的举例。//左右都为空/一个为空/都不为空但是值不相等/都不为空且值相等。因为需要不断地返回左右的信息给中,所以只有左右中的顺序可以。//如果只有一个叶子节点不为空,那么就返回该节点的深度+1;1.确认递归函数的参数和返回值:大多数二叉树算法的参数都只有节点和返回值。高度:二叉树中任意一个节点到叶子节点的举例。总结:需要收集孩子信息返回给上一级的使用后序。此题根节点的高度就是二叉树的最大深度。原创 2024-07-31 21:51:06 · 337 阅读 · 0 评论 -
day11 栈与队列-逆波兰+滑动窗口max+前k个高频元素
(pair1, pair2) -> pair1[1] - pair2[1],意思是当该频率较低时,则排到pq的前面。> 如果结果为正数,则 pair1 被视为大于 pair2,在队列中 pair1 会排在 pair2 之后(或具有更低的优先级)。> //2.再建立一个保存int[ ]类型的PriorityQueue,用小顶堆的方式保存,即让最小的元素第一个出去。当元素比dq中的最小值大时,则要将原最小值弹出,再填入新的最小值。//比如此时队列元素3,1,2将要入队,比1大,所以1弹出,此时队列:3,2。原创 2024-07-29 13:25:23 · 423 阅读 · 0 评论 -
day10 栈与队列-基础+栈和队列互相实现+有效括号+删除重复项
虚拟机栈采用后进先出的原则,所以线程当前执行的方法对应的栈帧必定在Java虚拟机栈的顶部。Queue是Java集合框架(Java Collections Framework)中的一个接口,队列中的数据元素遵循先进先出(FIFO,First In First Out)的原则,即最先插入的元素会最先被删除。在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。原创 2024-07-29 13:24:40 · 384 阅读 · 0 评论 -
Day06 HashTable-异位元素+交集+快乐数+两数之和
/map中的key和value用来存什么的:key用来存放数值(可以快速被查出该数值是否被遍历过,并且不希望重复),value用于存放下标(被查找的对象)。如果学生的数量大于哈希表的大小怎么办,此时就算哈希函数计算的再均匀,也避免不了会有几位学生的名字同时映射到哈希表 同一个索引下标的位置。此时为了保证映射出来的索引数值都落在哈希表上,我们会在再次对数值做一个取模的操作,这样我们就保证了学生姓名一定可以映射到哈希表上了。//记录t中每个元素出现的频次,如果这个元素和s中的元素一致,则相抵。原创 2024-07-23 01:14:32 · 590 阅读 · 0 评论 -
day09 字符串-反转单词+右旋+实现strStr()+重复子字符串
StringBuilder 和 StringBuffer 的 API(应用程序编程接口)在 Java 中是非常相似的,因为它们都继承自 AbstractStringBuilder 类,并提供了大量用于操作可变字符串的方法。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。> 然而,由于 synchronized 关键字的使用,StringBuffer 在多线程环境下的性能可能会受到影响,因为它在每次调用方法时都会进行线程锁定。原创 2024-07-27 20:28:17 · 381 阅读 · 0 评论 -
Day08 字符串-反转+替换
开始用obsidian记笔记了!原创 2024-07-26 00:23:00 · 312 阅读 · 0 评论 -
Day07 HashTable-勒索信+3/4数之和(可下标重复/不可下标重复)+从这天开始每天整理更新APIs
454. 4Sum II383. Ransom Note15. 3Sum18. 4Sum原创 2024-07-24 21:35:34 · 972 阅读 · 0 评论 -
Day04 链表-交换元素+移除特定元素+查交界点 +循环链表
并且自己写测试类的时候需要注意:headA和headB应该先把短的那个写好,长的那个用next连接。//2号的指针指向1号,此时2号是cur.next。//cur的指针指向2号。2.7 面试题 02.07. Intersection of Two Linked Lists LCCI。//当快指针和head指针继续走并相遇时退出循环,这里是相遇点。//1号的指针指向3。//双指针,快指针(一次走两个节点)和慢指针(一次走一个节点)如果可以相遇即有环。原创 2024-07-22 01:15:01 · 522 阅读 · 0 评论 -
Day03 链表-移除链表元素+设计链表 +反转链表
链表初学。原创 2024-07-20 00:16:30 · 1067 阅读 · 0 评论 -
Day01 数组-二分法+删除元素
Vocabulary: distinct integers 不同整数 35。原创 2024-07-18 11:19:50 · 590 阅读 · 1 评论 -
Day02 数组-双指针+spiralMatrix
right--;}else{left++;i++) {start++;0:result;原创 2024-07-18 16:33:01 · 527 阅读 · 1 评论