刷题随记
Jeffrey9264
我就懒
展开
-
【随记】222.完全二叉树的节点个数
我这里前面有一个判断cur==NULL了,我后面又来判断cur的左右子节点是否为空,这个就是没有掌握到递归的精髓,cur==NULL,递归下来其实就已经能够判断其左右子节点是否为空了。1.确定递归函数的参数与返回值:参数即树的根节点,返回值树的节点个数,int类型。2.确定递归终止条件:如果节点为空,就返回0,表示节点个数为0(当前层的视角)3.确定单层递归逻辑:左右子树的节点个数加当前节点的个数1。原创 2023-04-28 11:35:29 · 37 阅读 · 0 评论 -
【随记】111.二叉树的最小深度
如果某个节点只有左子树,没有右子树,那么结果就是左子树的最小深度+1(1是这个节点代表的深度)。1.确定递归函数的参数与返回值:参数即数的根节点,返回值树的最小深度int类型。但是这样有一个问题,最小深度的定义是:根节点到叶子节点的深度。2.确定递归终止条件:如果节点为空,就返回0,表示高度为0(当前层的视角)如果某个节点只有右子树,没有左子树,那么结果就是右子树的最小深度+1。那么按照上述做法,得到的结果是1,这个不符合最小深度的定义。这次求最小深度,递归三步走。最后取最小的深度+1。原创 2023-04-20 16:29:21 · 29 阅读 · 0 评论 -
【随记】104.二叉树的最大深度 & 559.N叉树的最大深度
3.确定单层递归逻辑:求每一棵子树的最大深度,取其中的最大值+1(+1为当前层高度,从下往上慢慢+1得到最终深度)3.确定单层递归逻辑:先求左子树的深度,再求右子树的深度,取两者最大值+1(+1是加上当前层的深度)2.确定递归终止条件:如果节点为空,就返回0,表示高度为0(当前层空节点的视角)1.确定递归函数的参数与返回值:参数即传入树的根节点,返回值即树的深度。1.确定递归函数的参数与返回值:参数即传入树的根节点,返回值即树的深度。递归一直都摸不透测,参考某位大佬的思路,规范的写一下递归的步骤。原创 2023-04-17 11:59:43 · 34 阅读 · 0 评论 -
【随记】226.翻转二叉树
过程如上图,递归交换每个节点的左右子节点(整颗子树都换被交换,本菜鸡先开始以为只单纯交换左右子节点)原创 2023-04-04 11:59:38 · 27 阅读 · 0 评论 -
【随记】二叉树层序遍历
思想:用一个队列存储每一层的节点。第一层节点先进队列处理完后,出队,下一层节点再进队列进行处理,以此类推。for循环的条件不要写i<que.size(),因为que.size()是变化的,先用一个变量记录下来。二叉树变为了N叉树,不再只有两个左右子节点了,所以只要知道如何对这种子节点进行遍历就好写了。这个就更简单了,把每一层的值加起来求个平均就行了,注意类型改为double。上一个题是自顶向上的层序遍历,这一个是自底向上的层序遍历。只记录从一棵树的右侧能看到的节点值。102.二叉树的层序遍历。原创 2023-03-31 09:35:24 · 29 阅读 · 0 评论 -
【随记】二叉树的前序中序后序遍历
可以先自己手写出三种遍历结果,再运行程序看看自己想对没有。想不清楚就结合代码思考何时打印,何时递归。对二叉树做一个回顾。原创 2023-03-29 17:36:14 · 28 阅读 · 0 评论 -
【随记】239.滑动窗口最大值
注意:最大值在起始位置时,窗口滑动后需要重新找最大值,举个例子[5,1,2,3](后面所有例子k=3),第一个窗口max=5,滑动后,如果不重新找max,那么max=5依然比3大,得不到第二个窗口的最大值3,重新找就是在1,2中找到max=2。如果它比队列尾部的元素大,则弹出队列尾部的元素,直到队列为空或新元素小于等于队列尾部的元素。例:[3,2,1,0]。对于每个元素,如果其值大于队列尾部元素的值,则从队列尾部依次弹出元素,直到队列尾部元素的值大于等于当前元素的值,再将当前元素的下标插入到队列尾部。原创 2023-03-27 21:44:46 · 35 阅读 · 0 评论 -
【随记】150.逆波兰表达式求值
2.判断是否为运算符时,如tokens[i] == "+",不要用tokens[i] == '+',这是错的,左边是字符串,右边是字符。也不要用tokens[i][0] == '+'(好像某些情况会出错,具体原因忘了,写代码的时候发现的)。1.先开始想的是遍历tokens,用isdigit()函数先判断该元素是否为数字,但是问题是,isdigit()函数只能判断一个字符,不能判断一个字符串,所以我采用isdigit(tokens[i][0])来判断,即判断每个字符串元素的第一个字符是否为数字。原创 2023-03-23 17:33:58 · 43 阅读 · 0 评论 -
【随记】1047.删除字符串中的所有相邻重复项
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string。删除字符串中的所有相邻重复项。来源:力扣(LeetCode)注意最后进行一个字符串反转。思想:栈的特性完美解决。输入:"abbaca"原创 2023-03-22 15:50:39 · 51 阅读 · 0 评论 -
【随记】20.有效括号
1.不要直接看完题就开始写代码,要分析不匹配的情况有哪些,想清楚了再写。(第一次就是直接开写,结果越写越乱)2.最后return的是st.empty(),非常巧妙,可以应对"(("这种情况。2).数量匹配的情况下,不匹配情况:"{[)}"、"))"、"(("。1).数量不匹配,如果字符数量为奇数,那么一定不匹配。原创 2023-03-21 11:19:50 · 33 阅读 · 0 评论 -
【随记】225.用队列实现栈操作
思想:前面一道用栈实现队列操作,用到了两个栈来实现。这道题也是用两个队列来实现栈操作,但是不是输入输出的关系,因为两个队列不像两个栈输入输出一倒腾,元素顺序就和队列一致了。比如,假设两个队列A、B,A放入[1,2,3],B为空,现在要出第一个元素也就是3(栈操作,3在顶部),用队列的操作将A里面的除了队尾的元素放入B中,此时A[3],B[1,2],取A中剩余元素作为返回结果,清空A,将B复制给A,清空B,如此反复。(这描述写得有点拉,可以结合代码理解)ps:top可以调用pop。原创 2023-03-20 21:40:55 · 34 阅读 · 0 评论 -
【随记】232.用栈实现队列操作
设计了两个栈来实现。一个输入栈,一个输出栈。当元素需要出队时,首先我们需要检查输出栈中有无元素,如果有,我们就直接取输出栈的top元素,然后pop掉;如果输出栈没有元素,我们需要将输入栈全部pop到输出栈中(为什么要全部pop出来到输出栈,思考栈与队列的元素顺序特性,两个栈的一进一出恰好实现队列的顺序),再从输出栈中取top,再pop掉。1.pop的时候,从输出栈取元素,写一次就行了,不需要在if中写了,又写个else再写一次,没必要多写个else,因为不管输出栈怎么样,最后都是从输出栈拿一个元素出来。原创 2023-03-19 17:23:42 · 30 阅读 · 0 评论