剑指Offer
努力修行
Ryanw丶
.
展开
-
24.二叉树和为某一值的路径
二叉树和为某一值的路径 题目链接 题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 题意中两个注意点: 所有路径 从树根结点到叶结点的路径,叶结点也就是终端结点。 DFS 所有路径结合二叉树我们想到了DFS,使用递归帮我们方便的解决...原创 2020-02-28 12:04:06 · 174 阅读 · 0 评论 -
23.二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列 题目链接 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 二叉搜索树 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右...原创 2020-02-28 10:28:32 · 839 阅读 · 0 评论 -
22.从上往下打印二叉树
22.从上往下打印二叉树 题目链接 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 非递归,队列辅助 从上到下,从左到右打印,也就是BFS思想了,以队列辅助,完成层次遍历。 时间复杂度O(n)。 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int...原创 2020-02-27 07:58:57 · 221 阅读 · 0 评论 -
21.栈的压人、弹出序列
栈的压人、弹出序列 题目链接 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 辅助栈 依旧采取辅助栈的规律。建立辅助栈s,模拟push...原创 2020-02-27 07:36:33 · 163 阅读 · 0 评论 -
18.二叉树的镜像
二叉树的镜像 题目链接 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11...原创 2020-02-25 10:51:21 · 181 阅读 · 0 评论 -
20.包含min函数的栈
包含min函数的栈 题目链接 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。 辅助栈 从之前两个栈实现队列,到实现带有min栈的功能。我发现了一个特点,想在栈的基础上增加或者改变功能,我们可以从增加一个辅助栈入手。 题目要求时间复杂度O(1)m...原创 2020-02-26 12:22:11 · 315 阅读 · 0 评论 -
19.顺时针打印矩阵
顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 模拟 遍历方向: 左->下->右->上,设置四个边界top,bottom,left,...原创 2020-02-26 11:38:40 · 127 阅读 · 0 评论 -
17.树的子结构
树的子结构 题目链接 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 子树与子结构的概念 子树:指包含树的某个结点下的所有结点的树结构。一个n个结点的二叉树有n棵子树。[CADB,A,DB,B,H,EHGM,GM…]等都是该二叉树的子树。 子结构:指包含树的某个结点,可包含左子树或者右子树,或者都左右子树包含的树结构。这样只要与树某一个结点有...原创 2020-02-25 10:13:11 · 329 阅读 · 0 评论 -
16.合并两个反转链表
合并两个反转链表 题目链接 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 递归 归并:把整个过程分为很多个子过程,每个过程满足规则,然后合并子过程。 链表1和链表2谁的首结点值小,谁就作为链表的首结点。一直判断到某一链表为NULL,直接将链表接上即可。 时间复杂度O(n),空间复杂度O(n)。 /* struct ListNode { i...原创 2020-02-24 11:10:34 · 226 阅读 · 0 评论 -
15.反转链表
反转链表 题目链接 题目描述 输入一个链表,反转链表后,输出新链表的表头。 辅助栈 通过栈辅助存取链表的值,然后遍历赋值。 时间复杂度O(n),空间复杂度O(n)。 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solut...原创 2020-02-24 08:54:29 · 166 阅读 · 0 评论 -
14.链表中倒数第k个结点
链表中倒数第k个结点 题目链接 题目描述 输入一个链表,输出该链表中倒数第k个结点。 直接查找 先遍历求得链表长度,再遍历查找。 时间复杂度O(n)。 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { p...原创 2020-02-23 10:40:22 · 253 阅读 · 0 评论 -
11.二进制中一的个数
二进制中一的个数 题目链接 题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 巧用位运算 n &= n-1的作用:消去n最低位的1。例子:当n=1010时,n-1=1001,此时n & n-1= 1000,达到了使二进制最低位的1变成0的效果。要想知道二进制中有多少个1,可以理解为要消去多少次最低位的1,记录次数即可。 时间复杂度O(logn) class...原创 2020-02-23 09:54:10 · 235 阅读 · 0 评论 -
13.调整数组顺序使奇数位于偶数前面
题目链接 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 遇偶寻奇 i表示当前指针,j=i+1表示后一个指针 核心思路: 如果array[i]为偶数,j向后寻找第一个奇数,奇数前插入,偶数整体部分后移。 每遇到一个偶数后的第一个奇数,就移动偶数,插入奇数,最坏的情况n...原创 2020-02-23 09:47:26 · 204 阅读 · 0 评论 -
12.数值的整数次方
数值的整数次方 题目链接 题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 保证base和exponent不同时为0 快速幂 根据下面推导,递归求解。 如果b为0,ab = 1 如果b为偶数 ab = ab/2 * ab/2 如果b为奇数 ab = ab/2 * ab/2 * a 时间复杂度O(logn)。 class...原创 2020-02-22 10:21:02 · 188 阅读 · 0 评论 -
10.矩形覆盖
矩形覆盖 题目链接 题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 记忆化搜索 思路与前面的递归题目一样。 时间复杂度O(n)。 class Solution { public:t int f[40]; int rectCover(int numb...原创 2020-02-22 09:15:52 · 208 阅读 · 0 评论 -
9.变态跳台阶
题目链接 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 妙用位运算 跳台阶的升级问题,跳上一个n级的台阶的跳法为f[n]。 跳一个1级台阶的跳法只有1种 0->1。 跳一个2级台阶的跳法有2种,从0->1->1和0->2。 跳一个3级台阶的跳法有4种,从0->1->1->1、0-&...原创 2020-02-21 11:15:44 · 213 阅读 · 0 评论 -
8.跳台阶
题目链接 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 记忆化搜索 上一个1级台阶有1种跳法,上一个2级台阶有2种跳法,上一个3级台阶有3种跳法。 上一个n级台阶有f[n] = f[n-1] + f[n-2] (n >= 3)中跳法。 时间复杂度O(n)。 class Solution { public: ...原创 2020-02-21 10:42:03 · 227 阅读 · 0 评论 -
7.斐波那契数列
斐波那契数列 题目链接 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39 记忆化搜索 fib(10) = fib(8) + fib(9); fib(9) = fib(8) + fib(7); 在斐波那契数列中,如果fib(n)的n是一定的,那么无论调用多少次都是相同的结果,而第二次调用f(n)无疑会重复计算,如果在第...原创 2020-02-20 22:20:37 · 330 阅读 · 0 评论 -
6.旋转数组的最小数字
旋转数组的最小数字 题目链接 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 直接查找 寻找非递减排序数组的旋转数组的最小值,例如[3,3,4,4,5],旋转...原创 2020-02-20 21:00:50 · 236 阅读 · 0 评论 -
5.用两个栈实现队列
用两个栈实现队列 题目链接 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 中转栈 栈通过辅助栈反转就能形成一个队列。stack1作为主栈,stack2作为辅助栈,使用2个栈实现队列的核心概念是:每次操作前都要保证具有队列的特点,这样每次操作时将stack1元素全部转移到stack2中,新元素压入栈底,再将stack2中元素返回stack1中。 pu...原创 2020-02-20 12:01:12 · 203 阅读 · 0 评论 -
4.重建二叉树
题目链接 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 算法背景: 前序遍历递归算法:NLR 先访问根结点N,再遍历左子树L,再遍历右子树R。 中序遍历递归算法:LNR 先访问左子树L,再访问根结点...原创 2020-02-19 11:22:36 · 282 阅读 · 0 评论 -
3.从头到尾打印链表
题目链接 题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 stack中转 存储倒序链表的值,首先想到的想法是顺序遍历将值存到堆栈中,再将值从堆栈转到vector中。 时间复杂度O(n),空间复杂度O(n)。 /** * struct ListNode { * int val; * struct ListNode *next; * ...原创 2020-02-18 22:48:59 · 150 阅读 · 0 评论 -
2.替换空格
题目链接 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 循环移动 每遇到空格就将后面的字符串向后移动2个单位,循环移动。 时间复杂度O(n2),空间复杂度O(n)。 class Solution { public: void replaceSpace(char *str,i...原创 2020-02-17 17:11:15 · 187 阅读 · 0 评论 -
1.二维数组的查找
题目链接 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 暴力搜索 拿到题目,就想到了直接暴力搜索,由于每一行、每一列是递增的顺序,就可以暴力从行开始搜索。 时间复杂度O(n2),空间复杂度O(1)。 class Solution { publ...原创 2020-02-17 09:35:15 · 206 阅读 · 0 评论