剑指offer
分析说明各种算法,剑指offer经典题目的思路分析,代码实现;
进修的CODER
沉迷学习,不能自拔。只要学不死,就往死里学。代码虐我千百遍,我待代码如初恋@_@
展开
-
剑指offer-面试题40:最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路分析两种思路可以实现,第一种是利用插入排序来实现,首先维持一个长度为K的有序序列,然后将剩下的数字插入到有序序列中去,直到最后一个元素,插入排序结束后就前面K个元素就是最小的K个数;第二种是利用快速排序来实现,需要改动一下,判断每次返回的partition位置是否等于K,根据返回的位置下标进行左右递归分治,直到最终返回的partition位置等于K时,前面K个元素就是原创 2020-05-14 18:12:42 · 287 阅读 · 3 评论 -
剑指offer-面试题39:数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路分析可以分析得到,有一个数字出现次数超过数组长度的一半,也就是说它出现的次数比其它所有数字出现次数的和还要多,如果数组长度为n,那么出现次数k肯定满足k > n/2。首先我们需要找出这个数字然后再判断出现的次数是否满足次数条件,我们考虑用两个值来找出这个数字。temp维持数组中原创 2020-05-14 18:04:25 · 239 阅读 · 0 评论 -
剑指offer-面试题38:字符串排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。思路分析全排列问题,我们可以把字符串分为两部分:一部分是字符串的第一个字符,另一部分是第一个字符以后的所有字符;然后拿第一个字符后面的字符逐个交换;例如字符串abc,字符a保持不动,字符b或c和字符a进行交换有两种情况:bac或cba;可原创 2020-05-14 17:48:16 · 263 阅读 · 0 评论 -
剑指offer-面试题37:序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己原创 2020-05-14 17:11:18 · 209 阅读 · 0 评论 -
剑指offer-面试题34:二叉树中和为某一值的路径
题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)思路分析要求二叉树中和为某一值的路径,路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。说明了路径是从根到叶子结点的,所以我们可以计算所有从根到叶子结点的值,然后判断...原创 2020-04-25 21:07:13 · 212 阅读 · 0 评论 -
剑指offer-面试题33:二叉搜索树的后序遍历序列
题目描述输入一个非空整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路分析 8 / \ 6 10 / \ / \ 5 7 9 11上图的二叉搜索树的后序遍历为:5 7 6 9 11 10 8,从后序遍历序列我们可以发现根是最后一...原创 2020-04-25 21:06:21 · 231 阅读 · 0 评论 -
剑指offer-面试题32.2:之字形打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路分析我们可以注意到当前行为奇数行下一行是从右到左进行访问的,当前行为偶数行是从左到右访问的,呈现的效果是加入的顺序和访问的顺序是相反的,所以我们首先想到利用栈来进行存储。根据前面的从上到下分行打印,我们知道如何进行换行和计算下一行的的节点...原创 2020-04-23 20:05:41 · 221 阅读 · 0 评论 -
剑指offer-面试题32.1:分行从上到下打印二叉树
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路分析从上到下打印二叉树的规律:每次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾,接下来到队列的头部取出最早进入队列的节点,重复前面的打印操作,直到队列的所有节点都被访问;对比按层从左到右打印,我们需要知道每一行有多少个元素,直至那个元素进行换行操作,我们使用两个变量来控制行的变化,t...原创 2020-04-23 20:05:04 · 237 阅读 · 0 评论 -
剑指offer-面试题32:从上到下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路分析根据题目信息,就是对二叉树进行按层从左到右遍历,可以用队列存储结点对应的左右孩子结点,然后从队列中取出结点继续进行访问和加入孩子结点,直到队列为空,就是用队列来临时存放访问顺序就可以了;从上到下打印二叉树的规律:每次打印一个节点的时候,如果该节点有子节点,则把该节点的子节点放到一个队列的末尾,接下来到队列的头部取出最早...原创 2020-04-23 20:04:35 · 229 阅读 · 0 评论 -
剑指offer-面试题31:栈的压入弹出
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路分析给了入栈序列和出栈序列,判断是否是正确的弹出序列。最好的办法就是使用一个栈来...原创 2020-04-23 20:04:04 · 190 阅读 · 0 评论 -
剑指offer-面试题30:包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。思路分析思路很简单,设置两个栈,一个栈stack存放所有元素,另一个栈minStack存放最小值,每次存放元素时,首先和minStack栈顶元素比较,如果更小就压入minStack栈中,再入st...原创 2020-04-23 20:03:32 · 196 阅读 · 0 评论 -
剑指offer-面试题29:顺序针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.思路分析注意到访问顺序是从左到右、从上到下、从右到左、从下到上这样一圈圈的进行访问的,我们可以发现每访问一圈行和列都...原创 2020-04-23 20:02:56 · 159 阅读 · 0 评论 -
剑指offer-面试题28:对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路分析题目说明如果一个二叉树同此二叉树的镜像是相同的,则定义其为对称的。通常我们有三种遍历方式,前序、中序、后序,例如前序就是先访问根结点,再访问左子结点,最后访问右子结点。参考前序遍历方式,我们可以定义一种新的对称遍历访问方式来进行访问,首先访问根结点,再访问右子结点,...原创 2020-04-22 16:21:58 · 182 阅读 · 0 评论 -
剑指offer-面试题27:二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义: 源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 ...原创 2020-04-22 16:21:25 · 173 阅读 · 0 评论 -
剑指offer-面试题26:树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构);思路分析树的子结构和树的子树需要区别开,树的子树指的是树的某一部分,例如图B就是图A的一部分为子树。子树的意思是包含了一个结点,就得包含这个结点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个结点为根的子树;子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取;...原创 2020-04-22 16:20:49 · 192 阅读 · 0 评论 -
剑指offer-面试题25:合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路分析两个链表都是有序的,所以通过比较指针指向的结点的数据值判断大小;循环递推的方式:设置两个指针,一个head指向头部,一个rear指向尾部,每次选取两个链表较小的结点连结在rear的后面,并且更改rear的指向,直到两个链表都访问结束;递归的方式:出口条件就是当结点为null时直接...原创 2020-04-22 16:20:12 · 153 阅读 · 0 评论 -
剑指offer-面试题24:链表反转
题目描述输入一个链表,反转链表后,输出新链表的表头。思路分析头插法,三个指针就可以实现了;代码实现public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } ListNode(int[] array) {...原创 2020-04-22 16:19:36 · 162 阅读 · 0 评论 -
剑指offer-面试题23:链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路分析链表中有环,我们可以用两个指针来进行处理,一个快指针每次走两个结点,一个慢指针每次走一个结点,如果链表中有环,经过一定的固定的循环往复,两个指针会指向同一个结点,类似于操场跑道,一个人跑得快3min跑一圈,一个人跑得慢6min跑一圈,6min内跑得快的人跑了2圈, 跑得慢的人跑了一圈,所以跑得快的人在某...原创 2020-04-22 16:19:00 · 152 阅读 · 0 评论 -
剑指offer-面试题22:链表中倒数第K个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路分析两种思路:方法一:设置两个指针,一个fast指针指向前面的元素,一个元素slow指针指向后面的元素,fast和slow指针的间隔距离为k,当fast指针到达末尾时,slow指针指向的结点就是倒数第k个结点;方法二:首先从头访问直到末尾,计算该链表结点数量n,然后再进行一次遍历寻找第n-k个结点,该结点就是倒数第k个结点;...原创 2020-04-22 16:18:28 · 148 阅读 · 0 评论 -
剑指offer-面试题21:调整数组元素使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路分析双指针思路,一个指针back遍历每个元素向后走,一个指针pre指向奇数元素的下一个;如果是奇数元素就将pre至back之间的数据元素向后移动,将当前奇数元素值放置于pre指针处,pre++指向下一个位置,直到遍...原创 2020-04-22 16:17:53 · 189 阅读 · 0 评论 -
剑指offer-面试题17:删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为1->2->5思路分析因为是一个排序的链表,所以重复的元素肯定在一起,可以使用双指针方法来解决该问题,用三个指针,一个指针pre指向前一个元素,一个指针mid指向第一个重复的元素,一...原创 2020-04-22 16:16:43 · 175 阅读 · 0 评论 -
剑指offer-面试题16:数值的整次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0思路分析double类型浮点数n的e次方,这里需要考虑e是正数、负数、0几种情况,当e为0时结果为1,如果e为负数取倒数就可以了,所以实现就很简单了,循环乘以n再根据e的正负来判断是否取倒数就可以了;代码实现public cl...原创 2020-04-22 16:16:11 · 195 阅读 · 0 评论 -
剑指offer-面试题15:二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路分析常规思路就可以求出这个数字的二进制的表示字符串,再统计表示字符串中1的个数,这种方式不一定能过;考虑位运算,因为1和1进行位与运算,同时为1时结果才为1,利用这种思路有两种方法:用数字1和输入的数字n进行位与操作,循环左移,如果位运算结果为1,1的个数则加一;利用n和n-1的关系,n和n-1每进行一次...原创 2020-04-22 16:15:38 · 179 阅读 · 0 评论 -
LeetCode72-编辑距离-动态规划
题目描述给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> ro...原创 2020-04-22 16:15:02 · 219 阅读 · 0 评论 -
LeetCode64-最小路径和-动态规划
题目描述给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。来源:力扣(LeetCode)链接:https...原创 2020-04-22 16:14:24 · 441 阅读 · 0 评论 -
LeetCode62-不同路径-动态规划
题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向右 -> 向下2....原创 2020-04-22 16:13:41 · 114 阅读 · 0 评论 -
剑指offer-面试题14:剪绳子-动态规划
题目描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。输入描述:输入一个数n,意义见题面。(2 <= n <= 60)输出描述...原创 2020-04-22 16:13:07 · 239 阅读 · 0 评论 -
剑指offer-面试题13-2:机器人运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路分析同样的回溯法思路,从起始坐标点(0...原创 2020-04-22 16:12:30 · 189 阅读 · 0 评论 -
剑指offer-面试题14:矩阵中的路径-回溯法
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如a b c es f c sa d e e矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符...原创 2020-04-22 16:11:00 · 196 阅读 · 0 评论 -
剑指offer-面试题13:旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路分析最简单的思路,从头到尾进行遍历一次,如果当前数字比前一个数字小,那么当前数字就是旋转数组最小的元素,...原创 2020-04-22 16:10:22 · 123 阅读 · 0 评论 -
剑指offer-面试题12:矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:思路分析覆盖2*n的大矩形,有两种覆盖方式,横着覆盖或者竖着覆盖,横着覆盖需要2个小矩形去覆盖,竖着覆盖需要1个矩形去覆盖;当n=3,横着放需要2个,剩下1个可以放左右,竖着放要3个,公式:f(n)=f(n-1...原创 2020-04-22 16:09:50 · 235 阅读 · 0 评论 -
剑指offer-面试题11:青蛙跳台阶问题
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路分析自顶向下分析,假设现在在n-1阶台阶,那么向上走1个台阶就可以达到n阶;如果现在在n-2阶台阶,那么向上走2个台阶就可以达到n阶,所以达到n阶的跳法:f(n)=f(n-1)+f(n-2),斐波拉契数列的应用;代码实现public class Solutio...原创 2020-04-21 15:40:26 · 226 阅读 · 0 评论 -
剑指offer-面试题10:斐波拉契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39思路分析斐波那契数列第一、二项为1,从第三项起为前面两项的和,直接递推或者递归都可以实现;代码实现递归版本public class Solution { public int Fibonacci(int n) { if (n == ...原创 2020-04-21 15:39:54 · 395 阅读 · 0 评论 -
剑指offer-面试题9:用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路分析这个题目要分析栈和队列各自的特点,栈的特点是先进后出(FILO),队列的特点是先进先出(FIFO);所以用栈来实现队列就要实现先进先出的效果,然而栈的效果是先进后出,这里需要两个栈来实现,一个栈A用来放,一个栈B用来出。当入队时直接将元素压入栈A,当要出队的时候有两种情况:情况一:栈B为空...原创 2020-04-21 15:39:17 · 202 阅读 · 0 评论 -
剑指offer-面试题8:二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路分析情况一:如果一个节点有右子树,那么它的下一个结点就是它右子结点的最左子结点;如图节点B的下一个结点是E;情况二:如果该节点没有右子树,并且该节点还是它父结点的左子结点,那么它的下一个结点就是它的父结点;如图节点I的父结点E是结点B的...原创 2020-04-21 15:38:47 · 190 阅读 · 0 评论 -
剑指offer-面试题7:重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路分析前序+中序或者后序+中序重建二叉树的方法是一样的,首先从前序序列中判断根结点,然后根据前序序列中查找到的根结点到中序序列判断该根结点的左右子树...原创 2020-04-21 15:38:14 · 210 阅读 · 0 评论 -
剑指offer-面试题6:从尾到头打印链表
题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。思路分析思路一:采用头插法将链表进行反转,然后从头到尾打印,打印出来的数据就是逆序了,但是这种操作会修改链表原有的结构;思路二:采用栈保存从头到尾的节点值,再出栈进行访问,也可以实现逆序输出,需要一个同等大小空间的栈来实现;代码实现/** * Copyright (c) 2020. * Email: love...原创 2020-04-21 15:37:37 · 303 阅读 · 0 评论 -
剑指offer-面试题5:替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路分析Java实现比较简单,直接通过StringBuilder进行动态添加就可以实现了或者正则表达式匹配,如果是C++的话就需要考虑空间扩展的大小和如何移动;代码实现/** * Copyright (c) 2020. ...原创 2020-04-21 15:36:51 · 189 阅读 · 0 评论 -
剑指offer-面试题4:二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路分析题目有两个维度,从左到右、从上到下都是递增的规律,如果从a[0][0]开始进行比较,如果目标值aimValue大于a[0][0],右边和下边两个方向都有可能,无法进行排除,所以要降低维度...原创 2020-04-21 15:36:20 · 197 阅读 · 0 评论 -
剑指offer-面试题3:数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路分析思路一:先对数组进行排序操作,使整个数组保持有序,然后从前向后访问,如果前一个元素和当前元素相同,说明该元素重...原创 2020-04-21 15:35:27 · 176 阅读 · 0 评论