- 博客(26)
- 收藏
- 关注
原创 Java Io中的设计模式
设计模式广泛应用于处理输入输出流的功能,以提高代码的可扩展性、可维护性和灵活性。常见的设计模式包括等,这些模式帮助我们更有效地实现数据的读取、写入、转换和处理。
2025-03-20 19:05:02
610
原创 status取消装箱时产生的空指针异常
此方法会先判断两个对象是否相等,只有当两者都不为空且确实不相等的情况下才会尝试调用。为了避免取消装箱时产生的空指针异常,可以采取多种措施来确保程序的安全性和稳定性。为了防止因取消装箱而引发的空指针异常,推荐使用。
2024-12-26 17:15:34
302
原创 代码随想录|贪心算法 455.分发饼干, 376.摆动序列
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。思路:本题要求通过从原始序列中删除一些元素来获得子序列,剩下的元素保持其原始数据。思路:可以优先考虑饼干,小饼干先喂饱小胃口,也可以优先考虑胃口,先喂饱大胃口。你的目标是满足尽可能多的孩子,并输出这个最大数值。局部最优:删除单调坡度上的节点,那么这个坡度就可以有两个局部峰值。如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为。,这是能让孩子们满足胃口的饼干的最小尺寸;整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。
2024-12-09 14:38:47
351
原创 代码随想录day24|回溯算法 93.复原ip地址, 78.子集, 90子集||
startIndex用来记录起始的位置,同时定义一个变量用来接受逗点的个数,在截取的子串中判断其是否合法,在考虑其合法性时主要考虑到如下三点。思路:path为子集用来收集元素,二维数组result存放子集组合,而当startIndex大于数组长度时此时终止,因为没有元素可取了。思路:效仿78.子集,只需要注意其中包含的重复元素进行增添去重操作即可。,其中可能包含重复元素,请你返回该数组所有可能的。,用以表示一个 IP 地址,返回所有可能的。返回的解集中,子集可以按。返回该数组所有可能的。
2024-11-26 22:56:49
420
原创 代码随想录day23|回溯算法 39.组合总和, 40组合总和||
与39.组合总和的套路相同,此题还需要加一个bool型数组used,用来记录同一树枝上的元素是否使用过,递归的终止条件与39.组合组合相同,终止条件为。定义两个全局变量,二维数组result存放结果集,数组path存放符合条件的结果。终止只有两种情况,sum大于target和sum等于target。,并以列表形式返回。中可以使数字和为目标数。给定一个候选人编号的集合。中所有可以使数字和为。
2024-11-25 21:32:50
325
原创 代码随想录day22|回溯算法, 77.组合, 216.组合总和|||
回溯和递归是相辅相成的,回溯法其实就是暴力查找,并不是高效的算法,回溯法可以用来解决如下几种问题,组合问题、切割问题、子集问题、排列问题、棋盘问题。什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。如果此时path里收集到的元素和(sum) 和targetSum(就是题目描述的n)相同了,就用result收集当前的结果。在上面我们提到了,回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度。
2024-11-23 16:52:19
339
原创 代码随想录day21|二叉树 669.修剪二叉树, 108.将有序数组转化为二叉搜索树, 538.将二叉搜索树转换为累加树
思路:遇到空节点直接返回,如果当前节点的元素小于low的数值,那么应该递归右子树,并且返回右子树符合条件的头节点,反之如果当前节点的元素大于high,那么应该递归左子树,并且返回左子树符合条件的头结点。改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。思路:选取中间节点作为一个根节点,然后将其分为左子树和右子树,递归遍历左区间,构成左子树,同理构成右子树。树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。
2024-11-21 16:54:41
287
原创 代码随想录day20|二叉树 235.二叉搜索树的最近公共祖先, 701.二叉搜索树的插入操作, 450.删除二叉搜索树中的节点
求最小公共祖先,需要从底向上遍历,二叉树只能通过后序遍历实现从底向上的遍历方式,在回溯的过程中,必然要遍历整棵二叉树,使用递归函数的返回值做逻辑判断,如果返回值left为空,right不为空返回right。遇到空返回,其实这也说明没找到删除的节点,遍历到空节点直接返回了,并且把二叉搜索树中删除节点遇到的情况都搞清楚。对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。按照二叉搜索树的规则去遍历,遇到空节点就插入节点就可以了。,新值和原始二叉搜索树中的任意节点值都不同。
2024-11-21 00:00:34
328
原创 代码随想录day18|二叉树 530.二叉搜索树的最小绝对差, 501二叉搜素树中的众数, 236.二叉树的最近公共祖先
思路:求最小公共祖先,需要向上遍历,二叉树只能通过后序遍历实现从底向上的遍历方式,遍历二叉树即使找到结果也要把其他节点遍历完,因为要使用递归函数的返回值做逻辑判断。:将在二叉树中求两个数差值简化为在一个有序数组上求求两个数最小差值,遍历一遍数组就可以统计出来最小差值。思路:遍历统计出现频率,相邻的两个元素做比较,取高频出现的频率即可。给你一个含重复值的二叉搜索树(BST)的根节点。差值是一个正数,其数值等于两值之差的绝对值。,找出并返回 BST 中的所有。(即,出现频率最高的元素)。
2024-11-19 12:06:49
274
原创 代码随想录day17|二叉树 654.最大二叉树, 617.合并二叉树, 700.二叉搜索树中的搜索
要合并两个二叉树,那么参数至少是要传入两个二叉树的根节点,返回值就是合并之后二叉树的根节点。因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了,反之则为t1。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;返回以该节点为根的子树。null 的节点将直接作为新二叉树的节点。给定二叉搜索树(BST)的根节点。
2024-11-18 12:10:12
420
原创 代码随想录day16| 404.左叶子之和, 513.找树左下角的值, 112.路径之和
如果遍历到空节点,那么左叶子值一定是0,当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。假定从根节点到当前节点的值之和为 val,我们可以将这个大问题转化为一个小问题:是否存在从当前节点的子节点到叶子的路径,满足其路径和为 sum - val,发现这满足递归的性质,若当前节点就是叶子节点,那么我们直接判断 sum 是否等于 val 即可。的路径,这条路径上所有节点值相加等于目标和。和一个表示目标和的整数。,返回所有左叶子之和。
2024-11-17 23:41:03
186
原创 代码随想录day15|二叉树 110.平衡二叉树, 257.二叉树的所有路径, 222.完全二叉树的节点个数
思路:这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。这道题目中涉及回溯,我们需要把路径记录下来,需要回溯来回退一个路径从而进入另一个路径。分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。所以如果已经不是二叉平衡树了,可以返回-1 来标记已经不符合平衡树的规则了。,返回所有从根节点到叶子节点的路径。
2024-11-16 11:23:13
366
原创 代码随想录day14|二叉树 226.翻转二叉树, 101.对称二叉树
思路 根据二叉树遍历方式的前序或者后序遍历都可以处理,但是如果使用中序遍历,可能会将其中有的元素翻转两回, 所以不使用中序遍历。思路 根节点的高度就是二叉树的最大深度,这道题可以通过后序求的根节点高度来求二叉树的最大深度。二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数。思路 本题只能使用后序遍历,因为需要先遍历左右子节点,然后返回中间节点。二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数。是指从根节点到最远叶子节点的最长路径上的节点数。给你一个二叉树的根节点。
2024-11-14 17:17:25
305
原创 代码随想录day13|二叉树 递归遍历, 层序遍历
写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。分为前序遍历,中序遍历,后续遍历。给定一个二叉树的根节点。给你一棵二叉树的根节点。
2024-11-13 11:37:49
415
原创 代码随想录day10|栈与队列, 232.用栈实现队列, 225.用队列实现栈, 20.有效的括号, 1047.删除字符串中的所有相邻重复项
一个队列为主队列,一个为辅助队列,当入栈操作时,我们先将主队列内容导入辅助队列,然后将入栈元素放入主队列队头位置,再将辅助队列内容,依次添加进主队列即可。思路 当左右括号匹配之后栈为空,所以可以根据这个思路进行编写,最后判断代码是否为空即可判断是否有多余的符号。将一个栈当作输入栈,用于压入 push 传入的数据;另一个栈当作输出栈,用于 pop 和 peek 操作。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(队列应当支持一般队列支持的所有操作(,判断字符串是否有效。
2024-11-11 15:10:30
293
原创 代码随想录day9|字符串 151.反转字符串中的单词, 右旋转字符串
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。那么针对数组删除操作的问题,其实在27.移除元素中就已经提到了使用双指针法进行移除操作。同样的道理在151.反转字符串中,我们使用O(n)的时间复杂度,完成了删除冗余空格。在344.反转字符串中,我们使用双指针法实现了反转字符串的操作,中使用至少一个空格将字符串中的。是由非空格字符组成的字符串。
2024-11-08 23:52:08
212
原创 代码随想录day8|字符串 344.反转字符串, 541.反转字符串||, 替换数字
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。定义两个指针,一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。在遍历字符串的过程中,只需要让i每次移动2*k即可,然后判断是否有需要反转的区间。
2024-11-07 13:19:20
306
原创 代码随想录day7|哈希表 454.四数相加, 383.赎金信, 15.三数之和 18.四数之和
思路本体使用哈希解法比较困难,可以采用双指针 的方法,首先将数组进行排序,定义一层i的for循环,同时定义left在i + 1的位置, 定义right在数组结尾的位置上。思路,四数相加可以拆解为两个两数相加,先计算其中两个数组中的数字相加并将其存入哈希表中,然后接着求剩下两个数组的和,并且判断是否等于前一个求和的相反数,若相等即找到一个。思路和有效字母的异位词相似,先将其中一个的字符与其次数存到哈希表中,然后再遍历另一个字符串进行判断。哈希函数是把传入的key映射到符号表的索引上。,请你计算有多少个元组。
2024-11-06 20:36:56
354
原创 代码随想录day6|哈希表 242.有效的字母异位词, 349.两个数组的交集, 202.快乐数, 1.两数之和
思路定义一个新的数组用来记录字符串s中字符出现的次数,在遍历字符串s时只需将s[i] - 'a'所在的元素+1即可,求出一个相对数值,对字符串t中是否出现做-1的操作。最后检查record数组中如果有元素不为0,说明s或者t中一定谁多或者少了字符,return false。思路当我们遇到快速判断一个元素是否出现在集合里面时,需要使用哈希法,判断sum是否重复出现,如果重复出现返回false,直到返回1为止。哈希表是根据关键码的值而直接进行访问的数据结构。整数,并返回它们的数组下标。,编写一个函数来判断。
2024-11-05 11:11:58
295
原创 代码随想录day4|链表24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点, 面试题 02.07. 链表相交
注意交点不是数值相等,而是指针相等,我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置,这里直接采用了代码随想录中的方法进行示例。快慢双指针的方法定义一个快指针和一个慢指针,让慢指针比快指针慢n个结点,这样当快指针到达null值时,慢指针恰好抵达倒数第n个结点,即可解题。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。可以用递归的方式实现链表中节点的两两交换,交换的终止条件是链表中没有节点或者只剩一个节点。给你一个链表,删除链表的倒数第。
2024-11-04 00:08:29
214
原创 代码随想录day3|链表 203.移除链表元素, 707.设计链表, 206.翻转列表
思路移除头节点与移除其它节点的操作是不一样的,移除其他节点通过前一个节点来移除当前节点,而头节点没有前一个节点,因此可以设置一个虚拟头结点再进行删除操作。思路只需要改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表。以指示链表中的上一个节点。假设链表中的所有节点下标从。你可以选择使用单链表或者双链表,设计并实现自己的链表。,请你反转链表,并返回反转后的链表。是指向下一个节点的指针/引用。如果是双向链表,则还需要属性。,请你删除链表中所有满足。给你一个链表的头节点。
2024-11-02 10:28:13
502
原创 代码随想录day2|数组 209.长度最小的子数组、59.螺旋矩阵、 区间和
刚开始看题没有什么好的思路,再学习之后发现用模拟的方法,可以分别定义lrtb来表示上下左右的边,然后用num来表示当前个数,n*n表示总元素个数,运用二分法中的左闭右开的思想,按照顺时针的方向来进行循环并对数组进行赋值。主要利用了滑动窗口的方法,先找到最开始符合要求的数组,然后将最左端的数组元素右移,然后重新将最右端的元素向又移动找到新的复合要求的数组,并将原数组以及新数组的元素个数进行比较。给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。个正整数的数组和一个正整数。
2024-10-31 22:25:21
388
1
原创 代码随想录day1|数组 704.二分查找、 27移除元素、 977有序数组的平方
尝试了暴力解法以及双指针的解法,双指针解法通过定义一个新的数组进行排序,原数组中正负数的差异会导致平方后排序发生改变,因此只需要比较数组头和尾的元素即可。2.若 target 是在一个在左闭右开的区间里,也就是[left, right)运用快慢指针的方法,快指针进行遍历,而慢指针用来生成一个新的数组。区间的定义这就决定了二分法的代码应该如何写,元素的顺序可能发生改变。,如果目标值存在返回下标,否则返回。个元素有序的(升序)整型数组。组成的新数组,要求也按。977有序数组的平方。
2024-10-31 01:31:54
457
原创 浅谈关于编程
2.作为一个很底层的编程语言,用C来学习计算机底层的原理。我知道我们的人生肯定不止这样,所以永远努力,永远向着光。1.C生万物,用C语言构建我编程思维。3.C语言可以用于嵌入式系统的开发。一名对编程有兴趣的大一学生。4.C语言可以编写硬件驱动。每天坚持学习编程两小时。
2023-11-20 19:08:20
113
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅