![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
_Volcano_我是火山君
这个作者很懒,什么都没留下…
展开
-
【剑指Offer】斐波那契数列之青蛙跳台阶
题目 问题一:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 问题二:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析 分析问题一: 将跳法总数记为f(n),可以知道f(1)=1,f(2)=2。当n>2时,第...原创 2019-09-01 11:39:58 · 204 阅读 · 0 评论 -
【剑指offer】切金条
题目思路 贪心策略是:把数组变成小根堆,每次都取堆中最小的,把这两个数的和再加到堆里。重复这样处理的过程,直到最后堆中只剩下1个数为止。 举个例子,1、2、6、4、3、7、1、8要组成小根堆:1)拿出2个1,将2个1结合,产生2,把2放回小根堆。此时小根堆含有2、6、4、3、7、8、22)拿出2个2,将2个2结合,产生4,把4放回小根堆。此时小...原创 2019-05-15 22:21:39 · 235 阅读 · 2 评论 -
【剑指offer】29、 顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。解题思路:矩阵的行数是rows,矩阵的列数是cols,有一个矩阵是这样的,设这个矩阵的左上角的点的坐标是(0,0),该矩阵如下:(0,0) (0,1) (0,2) (0,3)(1,0) (1,1) (1,2) (1,3)(2,0) (2,1) (2,2) (2,3)(3,0) (3,1) (3,2)...原创 2019-05-10 15:43:28 · 179 阅读 · 0 评论 -
【剑指offer】55-2、平衡二叉树
题目 输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。解题思路 在二叉树深度的基础上修改:计算树的深度,树的深度=max(左子树深度,右子树深度)+1。在遍历过程中,判断左右子树深度相差是否超过1,如果不平衡,则令树的深度=-1,用来表示树不平衡。 最终根据树的深度...原创 2019-04-30 17:40:32 · 136 阅读 · 0 评论 -
【剑指offer】55-1、二叉树的深度
题目 输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的/结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题思路 树的深度=max(左子树深度,右子树深度)+1,采用递归实现。测试用例 1.功能测试(左斜树、右斜树、普通树) 2.边界值测试(一个结点) 3.特殊测试(null)代码...原创 2019-04-30 16:27:47 · 83 阅读 · 0 评论 -
【剑指offer】54、搜索二叉树的第k个节点(存疑)
题目 给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8)中,按结点数值大小顺序第三小结点的值为4。解题思路测试用例代码总结...原创 2019-04-30 15:55:25 · 88 阅读 · 0 评论 -
【剑指offer】38、字符串的排列
题目 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。(本文代码采用ArrayList<String>接收返回的字符串,并要求不出现重复字符串)解题思路 第一步求所有可能出现在第一个位置的字符(即把第一个字符和后面的所有字符交换[...原创 2019-04-30 11:19:46 · 367 阅读 · 0 评论 -
【剑指offer】27、二叉树的镜像
题目 请完成一个函数,输入一个二叉树,该函数输出它的镜像。解题思路 Step1.先序遍历原二叉树的每个节点,如果遍历到的结点有子结点,就交换它的两个子结点。 Step2.递归遍历每个节点的子节点,同样,如果遍历到的子节点有子节点,就交换它的两个子节点。 当交换完所有非叶子结点的左右子结点之后,就得到了树的镜像。下图展示了求二叉树的镜像的过程: ...原创 2019-04-30 10:46:12 · 82 阅读 · 0 评论 -
【剑指offer】53-1、数字在排序数组中出现的次数
题目 统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3,3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。解题思路 首先分析如何用二分查找算法在数组中找到第一个k。二分查找算法总是先拿数组中间的数字和k作比较。如果中间的数字比k大,那么k只有可能出现在数组的前半段,下一轮我们只在数组的前半段查找就可以了。如果...原创 2019-05-05 15:02:18 · 106 阅读 · 0 评论 -
【剑指offer】53-3、数组中数值和下标相等的元素
题目 假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数找出数组中任意一个数值等于其下标的元素。例如,在数组{-3, -1,1, 3, 5}中,数字3和它的下标相等。解题思路不再从头到尾遍历,由于是排序数组,我们继续考虑使用二分查找算法: 1)当中间数字等于其下标时,中间数字即为所求数字; 2)当中间数字大于其下标时,在左半部分区域寻...原创 2019-05-05 14:34:16 · 165 阅读 · 0 评论 -
【剑指offer】53-2、0到n-1中缺失的数字
题目 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。解题思路 采用二分法来解决问题 如果数组中间的那个数等于其下标,那么要找的数应该在数组的后半段;low = mid+1 如果数组中间的那个数不等于其下标,...原创 2019-05-05 14:22:45 · 155 阅读 · 0 评论 -
【剑指offer】16、数值的整数次方
题目 实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。解题思路 对exponent进行分类讨论,同时也对base是否为0进行讨论。 exponent分为大于0,小于0,等于0。 当exponent大于0的时候,...原创 2019-05-25 10:52:52 · 89 阅读 · 0 评论 -
【剑指offer】17、打印从1到n最大的n位数
题目 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。解题思路 第一种思路是:先求出最大的n位数,然后用一个循环从1开始逐步打印。但是这个方法没有考虑到大数的问题。 第二种思路是: 在对字符串进行加1操作的函数中,对最低位进行加...原创 2019-05-25 15:41:06 · 603 阅读 · 0 评论 -
【剑指Offer】翻转单词顺序列
题目 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?样例输入...原创 2019-08-31 20:57:52 · 143 阅读 · 0 评论 -
【剑指offer】包含min函数的栈
题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。分析 新建一个数据栈,一个辅助栈。 入栈: 数据栈就是正常压入即可。 而对于辅助栈,如果每次都能把最小元素压入辅助栈,那么就能保证辅助栈的栈顶一直是最小元素。所以压入的时候...原创 2019-08-31 17:03:22 · 102 阅读 · 0 评论 -
【剑指offer】栈的压入、弹出序列
题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)分析 解决这个问题的方法是简历一个辅助栈,把输入序列...原创 2019-08-31 14:38:24 · 67 阅读 · 0 评论 -
【剑指offer】二叉树中和为某一值的路径
题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。分析 几个要点 1、由于路径是从根节点出发到叶节点,也就是说路径总是以根节点为起始节点,因此我们需要遍历根节点。在树的前序、后序、中序遍历中,只有前序遍历是首先访问根节点的。 2、由于二叉树没有...原创 2019-08-30 16:06:19 · 78 阅读 · 0 评论 -
【剑指Offer】51、数组中的逆序对
题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。思路 类似于归并排序。 我们用两个指针分别指向两个子数组的末尾,并每次比较两个指针指向的数字。 p1指向的数字大于p2指向的数字,存在逆序对。逆序对的数目 = 第二个数组中剩余数字的个数。将p1指...原创 2019-06-16 15:50:24 · 239 阅读 · 2 评论 -
【剑指offer】32、从上往下打印二叉树
题目(一)从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。(二)从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。(三)请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。思路1、每次打印一个节点的时候,如果该节点有子节点,则把该节点的...原创 2019-06-04 15:19:47 · 129 阅读 · 0 评论 -
【剑指offer】数据流中的中位数
题目 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。思路 采用大根堆+小根堆结合的方法,且满足: 两个堆中的数据数目差不能超过1,这样可以使中位数只会出现在两个堆的交接处; ...原创 2019-06-03 17:24:05 · 147 阅读 · 0 评论 -
【剑指offer】26、树的子结构
题目 输入两棵二叉树A和B,判断B是不是A的子结构。思路 1)先对A树进行遍历,找到与B树的根结点值相同的结点R;这一步相当于就是树的遍历。 2)判断A树中以R为根结点的子树是否包含和B树一样的结构。同样采用递归的思想:如果节点R的值和树B的根节点不同,则以R为根节点的子树和树B肯定不具有相同的节点;如果他们的值相同,则递归地判断他们各自的左右节点的值是否相同。递归的终止条...原创 2019-06-01 14:37:02 · 86 阅读 · 0 评论 -
【剑指offer】37、序列化二叉树
题目 请实现两个函数,分别用来序列化和反序列化二叉树。解题思路 通过先序遍历实现序列化和反序列化:1、假设序列化的结果字符串为str,初始的时候str=""。 先序遍历二叉树,如果遇到null节点,就在str的末尾加上“#!”,“#”表示这个节点为空,节点的值不存在,"!"表示值的结束。 如果遇到不为空的节点,假设节点的值为3,就在st...原创 2019-06-05 16:24:33 · 106 阅读 · 0 评论 -
【剑指offer】33、二叉搜索树的后续遍历序列
题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。思路 二叉树后序遍历数组的最后一个数为根结点,剩余数字中,小于根结点的数字(即左子树部分)都排在前面,大于根结点的数字(即右子树部分)都排在后面。根据遍历数组的这个特性,可以编写出一个递归函数,用于实现题目所...原创 2019-06-05 13:14:41 · 116 阅读 · 0 评论 -
【剑指offer】66、构建乘积数组
题目 给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。思路分析 考虑到计算每个B[i]时都会有重复,思考B[i]之间的联系,找出规律,提高效率。 ...原创 2019-04-29 16:38:53 · 97 阅读 · 0 评论 -
【剑指offer】40、数组中只出现一次的数字
题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。解题思路方法一(hashmap法): 遍历数组,将这个数组中的数字逐个存入到hash表中。 如果hashmap中,没有这个数字,就将这个数字存入到hashmap中,是将这个数值作为键,然后将它...原创 2019-04-29 11:24:38 · 240 阅读 · 0 评论 -
【剑指offer】41、和为S的两个数字
题目要求输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。解题思路法一:左右夹逼的方法。a+b=sum,a和b越远乘积越小,因为数组是递增排序,所以一头一尾两个指针往内靠近的方法找到的就是乘积最小的情况。若ai + aj == sum,就是答案(相差越远乘积越小)若ai + aj > sum,说明 ...原创 2019-04-24 15:30:12 · 73 阅读 · 0 评论 -
【剑指offer】21、调整数组顺序使奇数位于偶数前面
题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路分析: 这个题目的意思是,一旦出现偶数在奇数的前面,就把这两个数的位置交换一下。 准备两个指针,第一个指针初始化时指向数组的第一个数字,它只向后移动。 ...原创 2019-04-05 15:08:34 · 72 阅读 · 0 评论 -
【剑指offer】65、不用加减乘除做加法
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解题思路:按位异或进行的是不进位加法;使用位操作符号,按位与是进行的判断是否有进位。首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2。第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。第三步:重复上述两步,只是相...原创 2019-04-05 10:59:06 · 100 阅读 · 0 评论 -
【剑指offer】26、从上到下打印二叉树
题目要求从上到下打印二叉树的每个结点,同一层按照从左到右的顺序打印。例如数的结构如下: 1 2 34 5 6 7则依次打印 1、2、3、4、5、6、7解决方法打印的顺序是先打印根结点,然后再依次打印左结点和右结点,再继续打印左结点的左右结点。如果要打印某一个节点的左右节点,需要先获得该节点,然后再打印它的左右节点的值。利用...原创 2019-04-04 13:08:21 · 76 阅读 · 0 评论 -
【剑指offer】25、合并两个排序的链表
题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。分析:特殊情况: 当list1为空,则直接返回list2即可。 当list2为空,则直接返回list1即可。 当list1和list2都为空,则直接返回空。一般情况: 比较list1和list2的值...原创 2019-03-19 13:51:53 · 80 阅读 · 0 评论 -
【剑指offer】34、二叉树中和为某一值的路径
二叉树中和为某一值的路径 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 解题思路: 当用前序遍历的方式访问某一节点的时候,我们该把节点添加到路径上,并累加该节点的值。 如...原创 2019-03-18 11:26:07 · 72 阅读 · 0 评论 -
【剑指offer】旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。分析: 可以采用二分法来解决这个问题: 如果arr[m] >=...原创 2019-03-13 10:32:33 · 58 阅读 · 0 评论 -
【剑指offer】判断单链表是否有环
题目:给定一个链表,判断链表中是否有环。分析:快慢指针法:我们知道,假设一个链表有环,那么它就永远走不到头。设定有两个指针,一个快指针,一个慢指针。其中,快指针一次遍历两个节点;慢指针遍历一个节点,它们都是从头开始往后遍历所有的节点。如果链表中没有环,那么快指针与慢指针都会先后遍历完所有的节点。如果链表中有环,则快慢指针会进入环中直到某次的遍历时相遇。一旦相遇,就证明该...原创 2019-03-20 10:22:45 · 298 阅读 · 0 评论 -
【剑指offer】23、链表中环的入口结点
题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。首先,判断该链表中是否存在环; 定义两个从头节点开始的指针,一个是快指针,一个是慢指针。其中,快指针一次走2步,慢指针一次走1步。如果快指针最后追上了慢指针,说明链表中存在环。其次,需要得到环的节点数; 当两个指针相遇,证明链表一定存在环。而且两个指针相遇的节点一定在环中...原创 2019-03-20 10:02:06 · 151 阅读 · 0 评论 -
【剑指offer】二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。分析:一个整数减去1,与其自身进行与运算,会把该整数的右边的1变为0。一个整数中有多少个1,就可以进行多少次这样的运算。package swordOffer;public class NumberOf1s { public static int NumberOf1s(int n) { int count = ...原创 2019-03-11 10:55:06 · 71 阅读 · 0 评论 -
【剑指offer】重建二叉树
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。分析: 在二叉树的先序遍历中,第一个数是它的根节点; 在二叉树的中序遍历中,根节点的值在序列中间,...原创 2019-03-11 10:39:16 · 59 阅读 · 0 评论 -
【剑指offer】4、二维数组中的查找
题目要求: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解决思路: 首先选取数组中右上角的数字。 如果该数字等于要查找的数字,则查找结束; 如果该数字大于要查找的数字,...原创 2019-04-06 11:20:39 · 84 阅读 · 0 评论 -
【剑指offer】45、把数组排成最小的数
题目 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路 法1: 这题就是要我们自己定义一种比较方式。 我们设定:比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s...原创 2019-04-01 15:47:48 · 112 阅读 · 0 评论 -
【剑指offer】49、把字符串转换成整数
题目要求请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。解题思路本题考查的是将字符串转换为int类型的数字。思路很简单,但是就是要考虑一些特殊情况。字符串为null,空串,有除了数字之外的字符,溢出(整数的范围是-2147483648~2147483647).还有数字的正负问题,也需要考虑到其中。测试用例1.功...原创 2019-04-24 11:05:26 · 251 阅读 · 0 评论 -
【剑指offer】24、二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路二叉搜索树: 左子树<根<=右子树若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。...原创 2019-04-19 10:25:54 · 79 阅读 · 0 评论