剑指offer
Brett-Xu
Stay hungry! Stay foolish!
展开
-
[剑指offer]1、二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。分析:法一:一种方法将每行每列元素的值与目标值比较,相等返回true,遍历完还没有相等的返回false。bool Find(int target, vector<vector&...原创 2019-05-09 21:44:15 · 118 阅读 · 0 评论 -
[剑指offer]15、反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。分析:若链表为空或长度为1,直接返回。按下图所示,用p1、p2分别指向前两个结点,用p3记录p2的下一个结点,依次反转之后,再将p1、p2移到原来p2、p3的位置,直到p2为null为止,最后返回p1public class Solution { public ListNode ReverseList(ListNo...原创 2019-07-20 19:58:56 · 80 阅读 · 0 评论 -
[剑指offer]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.分析:顺时针打印,即为依次从左至右,从上至下,从右至左,从下往上。这里需要四个变量left、right、top...原创 2019-08-02 23:40:01 · 102 阅读 · 0 评论 -
[剑指offer]20、包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。分析:栈s1用来执行正常的压入弹出操作,栈s2用来存储最小的值。即只有当栈s2为空或者新压入的数据比s2栈顶的元素小时,才将数据压入s2;执行弹出操作时,当s1和s2栈顶元素相同时,才将s2栈顶元素弹出。最后s2栈顶的元素始终为最小值。import java.util.S...原创 2019-08-03 14:33:25 · 93 阅读 · 0 评论 -
[剑指offer]16、合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。分析:两个链表都是单调递增的,因此可以将head指向值较小的那个节点,再利用递归方法合并剩下的链表。public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { ...原创 2019-07-30 22:49:47 · 72 阅读 · 0 评论 -
[剑指offer]17、树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)分析:主要思路:1、由题目条件可知,两棵树都不能为空,否则直接返回false;2、寻找树A与树B根结点值相等的结点,记为R,判断以树A的R结点为根结点的子树是否包含B树(判断方法是将B树的左右子结点与R结点的左右子结点依次比较,若都相等,则为true);3、若不包含,则依次寻找树A的左子树...原创 2019-07-31 21:31:19 · 74 阅读 · 0 评论 -
[剑指offer]18、二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5...原创 2019-07-31 21:51:53 · 70 阅读 · 0 评论 -
[剑指offer]21、栈的压入弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)分析:可以新建一个栈tmp,根据压入序列进行压入,根据弹出序列依次弹出,如果最...原创 2019-08-05 23:15:47 · 112 阅读 · 0 评论 -
[剑指offer]22、从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。分析:同层从左至右打印,可以用队列来依次保存每一层的每个节点,并将该结点的值存入数组中;若该结点的左节点或右结点不为空,再将其放入队列,重复上述步骤。Java代码:public class Solution { public ArrayList<Integer> PrintFromTopToBo...原创 2019-08-06 23:42:46 · 76 阅读 · 0 评论 -
[剑指offer]23、二叉搜索树的后续遍历
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。分析:二叉搜素树指的是根节点的左子树的值都比根节点的值小,而右子树的结点的值都比根节点的值大。若给出的是数组是二叉搜索树的后序遍历,则最后一个值为根节点,如下图所示。法一:若是二叉搜索树的后序遍历,从根节点5开始,5前面的数先一直...原创 2019-08-10 12:44:36 · 96 阅读 · 0 评论 -
[剑指offer]12、数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。分析:由于exponent可能存在正负以及0的情况,因此需分情况讨论,当然前提是base不能为0。class Solution {public: double Power(double base, int exponent) { doub...原创 2019-07-06 22:23:57 · 87 阅读 · 0 评论 -
[剑指offer]11、二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。分析:当n不为0时,将n与n-1按位与,可将n的二进制数的最右边的1置为0,而1右边的数变为1,按位与之后n的二进制数就会少一个1,重复上述步骤,直到n为0为止,进行按位与的次数即为1的个数。class Solution {public: int NumberOf1(int n) { ...原创 2019-07-04 22:36:15 · 84 阅读 · 0 评论 -
[剑指offer]14、链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。分析:若链表长度为len,则倒数第k个结点就是正数第(len-k+1)个结点,因此可以先遍历链表一次,求出链表长度,再遍历至(len-k+1)个结点即可。但此做法需要遍历链表两次,可以让p1先走(k-1)个结点,再让p2从头开始,当p1到达链表末尾时,p2所在的位置即为第(len-k+1)个结点,也就是倒数第k个结点。在遍历的时候注意边...原创 2019-07-09 21:01:20 · 103 阅读 · 0 评论 -
[剑指offer]2、替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。分析:要将空格替换成“%20”,先计算空格的个数,然后得出新的字符串的长度,利用两个指针p1,p2,p1指向字符串原来末尾位置,p2指向新的末尾位置。若原字符串不为空格,直接更新,否则从后往前依次赋为‘0’‘2’‘%’。...原创 2019-05-09 21:51:31 · 77 阅读 · 0 评论 -
[剑指offer]7、斐波那契数列(三种方法)
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39法一:可以容易得到推导公式:,递归可求,时间复杂度为,不推荐此法。法二:根据公式,可以用F1记录F(n-2),F2记录F(n-1),依次相加,并更新F1和F2的值即可,时间复杂度为,代码如下:int Fibonacci(int n) { ...原创 2019-05-11 23:35:02 · 158 阅读 · 0 评论 -
[剑指offer]5、用两个栈实现队列
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。分析:栈是先进后出,而队列是先进先出。可以用两个栈实现队列的Push和Pop操作。栈s1用来记录Push的值,而因为Pop要取出最先压入的值,因此若栈s2为空时,将s1中的值从上至下依次压入s2中,此时s2中栈顶元素即为最先压入s1中的值。C++代码:class Solution{...原创 2019-05-30 23:44:48 · 72 阅读 · 0 评论 -
[剑指offer]3、从头到尾打印链表
题目描述:输入一个链表,按链表值从尾到头的顺序返回。分析:从头结点开始,依次把每个结点所对应的值进入vector的开头即可。C++代码:class Solution {public: vector<int> printListFromTailToHead(ListNode* head) { vector<int>res; ...原创 2019-05-28 23:18:53 · 108 阅读 · 0 评论 -
[剑指offer]6、旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。分析:法一:因为原数组是非降序排列,所以依次遍历数组,若后面的数字比前一个数小,即为整个数组最小,否则数...原创 2019-06-06 18:13:22 · 72 阅读 · 0 评论 -
[剑指offer]4、重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。分析:根据前序遍历可知第一位元素为根节点,接着遍历中序遍历序列,值与前序遍历序列的第一个值相等的即为根节点,记中序遍历中根节点的下标为pivo...原创 2019-06-01 19:17:06 · 98 阅读 · 0 评论 -
[剑指offer]8、跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。分析:n为1时,有1种跳法;n为2时有2种跳法;n为3时,可以从第1级台阶直接跳,也可以从第2级台阶直接跳,而跳到第1级和跳到第二级各有1和2种方法,所以n为3时有3种跳法。由此可知,有n级台阶时,跳法等于到n-1和n-2台阶的跳法之和,即,求法和斐波那契数列类...原创 2019-06-09 21:33:13 · 85 阅读 · 0 评论 -
[剑指offer]9、变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析:记f(n)为跳n级台阶的总跳法数,当n>1时,若第一次跳1级,则还剩n-1级台阶,有f(n-1)种跳法;若第一次跳2级,则还剩n-2级台阶,有f(n-2)种跳法......以此类推,若第一次跳n-1级,还剩1级台阶,有f(1)种跳法;若第一次跳n级,即为1种...原创 2019-06-10 23:12:36 · 77 阅读 · 0 评论 -
[剑指offer]10、矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?分析:n为1时,有1种方法;n为2时,有2种方法;n>2时,当第一块矩形竖着放时,则有f(n-1)种方法,当第一块矩形横着放时,则下面一块的位置也已经确定,则共有f(n-2)种方法,因此f(n)=f(n-1)+f(n-2),也是斐波那契数列。...原创 2019-06-16 19:18:32 · 86 阅读 · 0 评论 -
[剑指offer]24、二叉树中和为某一值的路径
题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。分析:1、因为要包含所有可能的路径,因此返回的结果res为二维数组,用一维数组path保存满足条件的单条路径的结点值2、从根节点开始,若当前结点为null,直接返回res3、若当前结点为叶子结点,且结点的值正好和目标值相等,...原创 2019-09-01 15:18:32 · 185 阅读 · 0 评论