
剑指offer
刷题笔记
小小小哥哥
这个作者很懒,什么都没留下…
展开
-
包含min函数的栈
1 描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。 此栈包含的方法有: push(value):将value压入栈中 pop():弹出栈顶元素 top():获取栈顶元素 min():获取栈中最小元素 数据范围:操作数量满足 0≤n≤3000 \le n \le 300 \ 0≤n≤300 ,输入的元素满足 ∣val∣≤10000|val| \le 10000 \ ∣va...原创 2022-01-26 20:46:49 · 155 阅读 · 0 评论 -
判断对称二叉树
递归 从根结点(结点)0开始,判断其左右子树是否对称,即判断「结点1所在子树」和「结点2所在子树」是否对称; 为比较这两个子树的对称情况,需要分别比较各自的左右孩子的对称情况,即:比较「结点3所在子树」和「结点4所在子树」是否对称,同时也需要比较「结点5所在子树」和「结点6所在子树」是否对称; 依次类推,直至遍历到叶子结点。 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *righ原创 2022-01-25 21:12:43 · 226 阅读 · 0 评论 -
判断平衡二叉树
自顶向下 一棵二叉树为「平衡二叉树」的条件为:该树为空树,或者其左右子树的高度差最大为1。因此,判断一棵二叉树是否平衡需要求其子树高度,并比较左右子树高度差。 因此此题的解题步骤如下: 设计「求二叉树高度」的函数getHeight(root),作用是求以root为根结点的二叉树高度; 遍历原二叉树,对其每个结点调用getHeight(root)函数,若存在某左右子树的高度差大于等于2,则是不平衡的;否则是平衡二叉树。 求取二叉树高度的思路如图所示。 class Solution { public原创 2022-01-25 20:48:14 · 536 阅读 · 0 评论 -
C ++双栈实现队列
设置两个栈,一个用来入队,一个用来出队列。 入队列:直接将元素stack1即可 出队列:如果stack2 不为空,则直接pop,否则先将stack1的元素全部弹出,然后全部压入stack2,然后将stack2的元素全部弹出。 class Solution { public: //入队列 void push(int node) { stack1.push(node); } //出队列 int pop() { int result{-1};//原创 2022-01-25 00:01:16 · 643 阅读 · 0 评论 -
斐波那契数列
方法1:递归 时间复杂度高 class Solution { public: int Fibonacci(int n) { if(n<=2) return 1; else return Fibonacci(n-1)+Fibonacci(n-2); } }; 时间复杂度:O(2^n) 空间复杂度:递归栈的空间 方法1:动态规划 class Solution { public: int dp[50]{0};原创 2022-01-22 22:30:13 · 301 阅读 · 0 评论 -
二叉树的深度
描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。 数据范围:节点的数量满足 0≤n≤1000 \le n \le 1000≤n≤100 ,节点上的值满足 0≤val≤1000 \le val \le 1000≤val≤100 进阶:空间复杂度 O(1)O(1)O(1) ,时间复杂度 O(n)O(n)O(n) 假如输入的用例为{1,2,3,4,5,#,6,#,#,7},那么如下图: .原创 2022-01-16 22:37:07 · 91 阅读 · 0 评论 -
删除链表的节点
描述 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。 1.此题对比原题有改动 2.题目保证链表中节点的值互不相同 3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点 数据范围: 0<=链表节点值<=10000 0<=链表长度<=10000 示例1 输入: {2,5,1,9},5 返回值: {2,1,9} 说明: 给定你链表中原创 2022-01-16 22:21:26 · 141 阅读 · 0 评论 -
链表中倒数最后k个结点
描述 输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。 如果该链表长度小于k,请返回一个长度为 0 的链表。 数据范围:0≤n≤1050 \leq n \leq 10^50≤n≤105,0≤ai≤1090 \leq a_i \leq 10^90≤ai≤109,0≤k≤1090 \leq k \leq 10^90≤k≤109 要求:空间复杂度 O(n)O(n)O(n),时间复杂度 O(n)O(n)O(n) 进阶:空间复杂度 O(1)O(1)O(1),时原创 2022-01-15 22:17:18 · 210 阅读 · 0 评论 -
链表中环的入口结点
描述 给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。 数据范围: n≤10000n\le10000n≤10000,1<=结点值<=100001<=结点值<=100001<=结点值<=10000 要求:空间复杂度 O(1)O(1)O(1),时间复杂度 O(n)O(n)O(n) 例如,输入{1,2},{3,4,5}时,对应的环形链表如下图所示: 可以看到环的入口结点的结点值为3,所以返回结点值为3的结点。 输入描述:原创 2022-01-15 20:37:06 · 123 阅读 · 0 评论 -
两个链表的第一个公共结点
描述 输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) 数据范围: n≤1000n \le 1000n≤1000 要求:空间复杂度 O(1)O(1)O(1),时间复杂度 O(n)O(n)O(n) 例如,输入{1,2,3},{4,5},{6,7}时,两个无环的单向链表的结构如下图所示: 可以看到它们的第一个公共结点的结点值为6,所以返回结点值为6的结点。 输入描述:.原创 2022-01-13 22:45:15 · 187 阅读 · 0 评论 -
合并两个排序的链表
描述 输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。 数据范围: 0≤n≤10000 \le n \le 10000≤n≤1000,−1000≤节点值≤1000-1000 \le 节点值 \le 1000−1000≤节点值≤1000 要求:空间复杂度 O(1)O(1)O(1),时间复杂度 O(n)O(n)O(n) 如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所原创 2022-01-13 00:44:39 · 247 阅读 · 0 评论