![](https://img-blog.csdnimg.cn/b3ffc69cac7e46b3976d9d8890068071.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法刷题
文章平均质量分 60
算法刷题
兀坐晴窗独饮茶
我的个人博客 http://knightzz.cn/
展开
-
二叉树的迭代遍历
此时栈中 {5,4,2} , p 此时指向 2 的左子树, 但是左子树是null, 我们就需要将栈顶元素出栈 2 , 此时指针再指向 2 的右子树, 以此类推,使用一个指针 p 一直向左走, 将走过的节点放入栈中, 这里注意, 栈是先入后出的, 所以出栈时的顺序正好是我们中序遍历的顺序, 当指针走到叶子节点时,前序遍历的序列是: [5,4,2,1,6] , 栈的出入顺序是, 先入, 后出, 假如我们想要一个元素先出, 就要让它后入栈。得到 中右左的顺序, 然后再逆序即可.原创 2023-01-21 22:19:32 · 1784 阅读 · 0 评论 -
图解二叉树的构造 | 中序 + 后序
我们要递归, 需要首先确定递归函数, 因为题目是以数组形式, 我们如果要取数据, 需要开始和结束下标, 所以递归函数的下标是。下一步是终止条件, 因为是给定了下标, 如果下标不合法, 说明到达终止条件, 因为递归的话, 需要不断去划分左右子树。递归思路很简单, 因为无论是构造一棵大树还是一棵小树, 都是重复的子问题, 思路主要麻烦在边界上。上述是中序和后续序列。原创 2023-01-16 21:36:56 · 955 阅读 · 0 评论 -
110.平衡二叉树 | 分治思想
平衡二叉树 : 每个节点 的左右两个子树的高度差的绝对值不超过 1。, 只要有一个节点对应的子树不是, 这棵树就不是平衡二叉树。层序遍历 + 获取每个节点的最大深度判断。一棵树是否是平衡二叉树, 是。原创 2023-01-13 23:58:35 · 559 阅读 · 0 评论 -
二叉树的深度 | 分治 +回溯 + 迭代
最大深度之所以ok是计算的是最大深度, 右边即使是1也不影响, 但是如果计算的是最小深度, 在比较时, 就无法真正获取最小深度。思路很简单 : 层序遍历, 每走一层, depth+1, 第一次遇到叶子节点就是最小深度。终止条件 : 叶子节点, 特征是 左右子树为空。这个思路也可以处理最大深度, 也是一样的。原创 2023-01-13 23:56:54 · 638 阅读 · 0 评论 -
222.完全二叉树的节点个数 |递归优化思路 + 复杂度分析
进一步分解, 假设我们要统计上面树的节点数, 就变成了统计左子树 4 和右子树 5 的两棵子树的节点数的子问题, 这个问题逐渐分解, 分解到最小单位。递归的思路很简单, 假设们要统计一棵树的节点数, 那么 只要统计根节点的左子树的节点数, 和右子树的节点数加上根节点即可。那么, 假设我们要统计左子树的节点数, 其实就变成了统计以2为根节点的树的节点个数。实际上本题是完全二叉树, 满二叉树的计算公式是假设层数是h, 节点数是。, 因为其实是访问了所有的节点, 计算满二叉树的时间复杂度是层高。原创 2023-01-12 21:58:22 · 714 阅读 · 0 评论 -
101.对称二叉树 | 递归 + 迭代
先判断是否满足终止条件, 也就是存在 left.right 或者 right.left 为空的情况, 此时不对称, 直接就返回结果了。同理, 我们对比内侧其实就是对比的 left.right 和 right.left 这两棵子树是否对称。然后我们要对比以 left 为根节点 和 以right 为根节点的树, 如下图所示, 这个很关键。左节点为空, 右节点不为空, 不对称 (注意这里是左节点和右节点, 而不是左子树和右子树)需要补充的是, 当最后到达叶子节点时, 其实叶子节点也可以看做左右子节点都为空的树。原创 2023-01-11 22:36:19 · 292 阅读 · 0 评论 -
239.滑动窗口最大值 || 单调队列 || 模板题
239滑动窗口最大值原创 2022-10-12 19:08:43 · 241 阅读 · 0 评论 -
11.盛水最多的容器 || 双指针
这个思路和计算两数之和三数之和差不多, 利用夹逼定理, 移动两个指针 , 盛水的大小时由最短的那一边决定的, 并且移动的过程中, 宽度是一直减小的。轴共同构成的容器可以容纳最多的水。找出其中的两条线,使得它们与。**说明:**你不能倾斜容器。返回容器可以储存的最大水量。原创 2022-09-27 21:16:22 · 71 阅读 · 0 评论 -
15.三数之和 || 双指针
只要有两个相同的 i , 那么一定会出现重复的 [i, j, k] , 因为 i 相同, 传入 twoSum() 中对应的 nums 也是重合的。无论对于 i = 1 还是 i = 2 来说, 都可以得到 [-1, 2] 这一组满足条件的值(这一题要注意和两数之和的区别 : 两数之和的结果仅仅有一个, 而三数之和有多个结果并且不能重复。但是 题目要求 nums[i] + nums[j] + nums[k] = 0 , 满足。, 并且所有的三元组必须都是不重复的。), 所以我们需要把相同的剔除。原创 2022-09-26 19:52:10 · 268 阅读 · 0 评论 -
167.两数之和II-输入有序数组 || 双指针
初始状态 : target = 9 , sum = nums[start] + nums[end]还有一种方法就是使用两个指针 , 然后先固定一个的值, 移动另外一个来判断当前的值是否符合。你所设计的解决方案必须只使用常量级的额外空间。,请你从数组中找出满足相加之和等于目标数。如果设这两个数分别是。的形式返回这两个整数的下标。以长度为 2 的整数数组。重复使用相同的元素。原创 2022-09-24 09:40:13 · 195 阅读 · 0 评论 -
206.反转链表
主体思路 : 遍历所有节点, 改变节点的指向方向原创 2022-06-28 22:10:41 · 120 阅读 · 0 评论 -
25.K个一组翻转链表
基本思路如下 :主体思路很简单, 分组去反转对应部分的链表, 然后再去考虑和当前组前面和后面节点的链接首先我们要实现一个获取链表尾部的方法 :代码很简单, 但是要注意一些细节 :其次我们要将 链表的头部和尾部节点传入到 方法内去反转链表的边, 这个思路和的思路基本一致, 但是有一点不同注意细节 :反转链表时, 初始状态 last 是指向 null 的, 假如有5个节点, 我们实际上要反转 5条边, 包含开头指向null的边但是在这道题里面, 我们仅仅需要反转 n - 1 条边,如下图, 实际上我们要反原创 2022-06-28 22:09:15 · 388 阅读 · 0 评论 -
283.移动零
主体思路 :细节问题 :原创 2022-06-28 20:59:09 · 47 阅读 · 0 评论 -
283.移动零
主体思路 :细节问题 :原创 2022-06-23 16:56:16 · 50 阅读 · 0 评论 -
88.合并有序数组
注意 : 在思考时, 先实现主体思路, 再思考细节问题(边界情况)主体思路 :细节问题 :可以看到上面的代码, 变量一共有3个 , 其中 k 的值始终是大于 0 的 所以 k 值是在整个过程中不会数组越界。但是对于 和 是没有限制的 所以需要判断边界条件, 和都需要大于等于 才可以 表示 nums2 数组的元素已经合并完毕了...原创 2022-06-23 16:29:24 · 68 阅读 · 0 评论 -
26.删除有序数组的重复项
主体思路细节问题 :可以看到上面的代码 , 边界部分只有 和 , 对于 来说, 最大值是 的长度, 所以不会越界。但是对于 i 来说 i 初始值 为 , 且最开始时的 号元素也要放入数组 , 并且在之后满足 条件所以 要加一个 的边界条件...原创 2022-06-23 16:24:25 · 82 阅读 · 0 评论