![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
antchow-
这个作者很懒,什么都没留下…
展开
-
二叉树中和为某一值的路径
题:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路:这个题的思路其实很简单,先把二叉树从根节点到叶子节点的所有路径找出来,然后一条路径一条路径去找符合的就行了。关键就是在找路径这个地方。由于我们不能知道这颗二叉树到底有多少条路径,所以我们得找完一条路径,就判断这条路径是否符合条件,这就关系到路径的存储问原创 2017-10-20 18:43:17 · 459 阅读 · 0 评论 -
用两个栈实现一个队列
题:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:栈是先进后出,队列是先进先出,所以用栈1来入栈,用栈2来出栈。对于入栈:首先判断栈2是否为空,如果不为空,先把栈2所有的元素倒入栈1,然后再把需要入栈的元素入到栈1;其他情况,则直接把需要入栈的元素入到栈1。对于出栈:首先判断两个栈是否都为空,为空则抛出空指针异常。不为空则再判断栈2是否为空,如果栈2不原创 2017-09-13 17:05:52 · 273 阅读 · 0 评论 -
青蛙跳台阶
题:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:标准的动态规划题。跟斐波拉契数列一样的,当只剩最后一步就可以跳到第n级台阶的时候,只有两种跳法,那就是从n-1级跳到n级和从n-2级跳到n级。所以要求跳到n级的总方法数就只需要求跳到n-1级的总方法数和跳到n-2级的总方法数,写成关系式就是F(n)=F(n-1)+F(n-2),这正好就是斐波拉契数列的原创 2017-09-13 17:43:34 · 284 阅读 · 0 评论 -
变态跳台阶
题:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:首先这个青蛙比以前的青蛙更厉害了,可能是被机器学习训练的更加牛逼了。。如果还用之前的动态规划来求解,那么最后一步就有n-1种可能,这个就不符合我们用动态规划的初衷了。 但是我们还是可以用动态规划来分析一下,当还剩最后一步就到达终点的时候,有n-1种走法,就是一次跳1级、一次跳两级。原创 2017-09-13 19:05:33 · 264 阅读 · 0 评论 -
矩形覆盖
题:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路:这道题,看起来很复杂,其实还是一个最基本的动态规划题。题目说的是2*n的矩形。 我们可以不看第二行,只看第一行,这时候就变成了1*n的矩形。这下是不是和青蛙跳台阶是一样的了,当只剩最后一个2*1的矩形的时候,只有两种方法,第一种是横着放,第二种是竖着放,横着放的情原创 2017-09-13 19:24:39 · 233 阅读 · 0 评论 -
整数的二进制中1的个数
题:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路1:对于输入的整数n,判断它的二进制表示的最右边是否为1,然后将n右移一位,直到n为0,就可以得出整数n的二进制表示中1的个数。怎么判断二进制表示的最右边是否为1呢,拿n与1做与运算,因为1的二进制表示为0001,所以,如果n的二进制表示的最右边为1,那么与运算的结果就是1。代码:public int NumberOf1(int原创 2017-09-14 11:18:59 · 705 阅读 · 0 评论 -
反转链表
本文转自:http://blog.csdn.net/feliciafay/article/details/6841115 我自己对原文做了部分修改。如何把一个单链表进行反转?方法1:将单链表储存为数组,然后按照数组的索引逆序进行反转。方法2:使用3个指针遍历单链表,逐个链接点进行反转。方法3:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的转载 2017-09-14 17:26:46 · 339 阅读 · 0 评论 -
最长子序列
题:给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱) 例如:给定一个长度为8的数组A{1,3,5,2,4,6,7,8},则其最长的单调递增子序列为{1,2,4,6,7,8},长度为6。思路1:第一眼看到题目,很多人肯定第一时间想到的是LCS。先给数组排个序形成新数组,然后再把新数组和原数组拿来求LCS,即可得到答案。这种解法很多人能想得到,所以就不再赘述。思路2:按原创 2017-09-18 13:52:56 · 760 阅读 · 0 评论 -
合并两个有序的链表
题:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:用一个新链表c来记录两个链表a,b合成后的链表。同时遍历a,b,每次比较a和b的元素,把小的放入c里,并且把放入c里面的元素所属的链表往后移一位。比如说现在a所指向的节点的值为2,b所指向的节点的值为3,这时候,把a所指向的节点放入c中,并且把a指向2的下一个节点。直到a,b的元素都放入c中,合并结原创 2017-09-18 15:52:46 · 445 阅读 · 0 评论 -
树的子结构
题:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:首先要判定B是不是A的子结构。则需要判断B的根节点是否存在于A里面。这个很好写,直接递归遍历树A找出节点值等于B的根节点值的节点即可。找到之后需要匹配B和从A中找出的这个节点是否一样,如果不一样,再从当前节点的左右子树一直找,找到后再匹配。一直重复查找-匹配这两步直到匹配成功或者遍历完A树为止。怎么匹原创 2017-09-18 18:18:00 · 463 阅读 · 0 评论 -
顺时针打印矩阵
题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.代码:public ArrayList<Integer> printMatrix(int [][] matrix) { A原创 2017-09-28 12:26:29 · 328 阅读 · 0 评论 -
从上往下打印二叉树
题:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:请看清楚这道题,同层节点从左至右打印,现有的二叉树的前序、中序、后序遍历都是不满足题目的条件的。 这里可以借助队列来实现,从二叉树的根节点开始,写个循环依次按照从左往右的顺序把节点添加到队列里,一边添加的同时,一边从队列中取队列的第一个节点,取完之后就删除这个节点,直到队列为空,循环结束。由于队列的特性是先进先出,所以可以保住打印的时候原创 2017-10-16 15:51:02 · 911 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:根据二叉搜索树的特性以及二叉树的后序遍历特性我们可以知道,数组的最后一个数字为二叉搜索树的根节点,从数组的第一位开始,直到第一个数值大于根节点的位置,为二叉搜索树的左子树,剩下的为二叉搜索树的右子树。因为二叉搜索树的特点是左小右大,所以如果右子树里面出现原创 2017-10-17 16:00:00 · 422 阅读 · 0 评论 -
根据二叉树的前序遍历和中序遍历构造二叉树
题:给出某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列pre:{1,2,4,7,3,5,6,8}和中序遍历序列in:{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:令pi=pre[0],由二叉树的前序遍历特性可知pi为二叉树的根节点root,遍历in,得到in[j]==pi的下标j,由二叉树的前序遍历和中原创 2017-09-12 18:30:58 · 994 阅读 · 0 评论