![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
Heroin X
文艺情怀的理工直男
展开
-
LeetCode-3.7-面试题59 II-M-队列的最大值
文章目录思路解法定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1示例 1:输入:[“MaxQueue”,“push_back”,“push_back”,“max_value”,“pop_front”,“m...原创 2020-03-07 22:42:23 · 136 阅读 · 0 评论 -
剑指Offer-栈-面试题59-1-E:滑动窗口最大值
文章目录思路解法1-暴力解法2-暴力法的优化解法3-双端队列思路(1)同题:LeetCode-Heap-239-H:滑动窗口最大值(2)暴力解法。注意结果数组的大小,第二层循环的控制方法。(3)双端队列。解法1-暴力class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if (n...原创 2020-03-16 19:47:47 · 172 阅读 · 0 评论 -
剑指Offer-栈-面试题30:包含min函数的栈
文章目录思路解法定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); -...原创 2020-03-16 15:47:00 · 132 阅读 · 0 评论 -
剑指Offer-树-面试题55-2:平衡二叉树
CONTENT思路解法1输入一棵二叉树,判断该二叉树是否是平衡二叉树。平衡二叉树:平衡二叉树的提出就是为了保证树不至于太倾斜,尽量保证两边平衡。因此它的定义如下:(1)平衡二叉树要么是一棵空树(2)要么保证左右子树的高度之差不大于 1(3)子树也必须是一颗平衡二叉树思路(1)需要注意是左右子树中的高度差,即分别为左右两个子树中的最长路径(图2所示);而不是左右子树中的两条路径差(图1...原创 2020-01-14 18:56:05 · 190 阅读 · 0 评论 -
剑指Offer-树-面试题55-1:二叉树的深度
CONTENT思路解法1解法2输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路(1)参考了之前做的面试题34:二叉树中和为某一值的路径 的思路,复杂化了本道题。(2)return maxLength ;是return给上一层递归方法调用处,不写return则会遇到}结束。(3)优化解法。解法1import j...原创 2020-01-14 13:57:06 · 186 阅读 · 0 评论 -
剑指Offer-树-面试题54:二叉搜索树的第k个结点
CONTENT思路解法给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路wait解法...原创 2020-01-14 13:20:37 · 128 阅读 · 0 评论 -
剑指Offer-树-面试题37:序列化二叉树
CONTENT思路解法请实现两个函数,分别用来序列化和反序列化二叉树:(1)二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。(2)二叉树的反序列...原创 2020-01-14 13:18:05 · 150 阅读 · 0 评论 -
剑指Offer-树-面试题36:二叉搜索树与双向链表
CONTENT思路解法输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路排序,可以想到是BST的前序遍历,但是后续步骤比较迷糊。其实只要在前序遍历的基础上加个指针指向就可以了。关于递归部分为什么用if(){ }else{ },直接使用if(){}便会报错。root的头结点right 会指向自己node,即本身。造成死循环!...原创 2020-01-13 21:28:07 · 121 阅读 · 0 评论 -
剑指Offer-树-面试题34:二叉树中和为某一值的路径
CONTENT思路解法输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)。思路(1)真正的递归条件是if (root == null){ return ;} 记住永远是当前层,这样才是完整的递归!(2)其实end condition 2与后...原创 2020-01-11 15:45:13 · 199 阅读 · 0 评论 -
剑指Offer-树-面试题33:二叉搜索树的后序遍历序列
CONTENT思路解法输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路(1)本道题整体上和面试题7:重建二叉树思路较为一致。首先找到根结点,每次用根结点来进行分割左右子树,抓住左右子树和二叉搜索树中序遍历的特性。左边<根<右边!(2)在提交中有两个错误点。 1) 递归终止条件。2)关于...原创 2020-01-10 15:39:04 · 122 阅读 · 0 评论 -
剑指Offer-树-面试题32-3:按之字形顺序打印二叉树
CONTENT思路解法请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路在之前的基础上,借用了栈和两个队列。解法nowcoder的AC提交时间:2020-01-10 ,语言:Java ,运行时间: 30 ms ,占用内存:9616K ,状态:答案正确import java.util.*;...原创 2020-01-10 10:11:13 · 127 阅读 · 0 评论 -
剑指Offer-树-面试题32-2:分行从上到下打印二叉树
CONTENT思路解法1-两个队列从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路解法1-两个队列(1)参考了前面的题,借助队列进行广度优先遍历。不同的是,此处使用了两个队列进行处理。感谢朱政师兄的指导。(2)注意if (queue1.size()==0){},而不是if (queue1 == null){}。容器VS结点。nowcoder的AC提交时间:2020...原创 2020-01-08 20:38:02 · 111 阅读 · 0 评论 -
剑指Offer-树-面试题32-1:不分行从上到下打印二叉树
OCNTENT思路解法从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路(1)本道题需要借助队列。反而不能乱用递归!(2)第一次写成了前序遍历: if(root == null ){ return null; } list.add(root.val); printNode(list,root.l...原创 2020-01-08 12:45:14 · 97 阅读 · 0 评论 -
剑指Offer-树-面试题28:对称的二叉树
CONTENT思路解法1-三步走解法2-参考请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路(1)题中已经给出了思路,比较镜像。所以本题解法步骤分为 复制树,转化为镜像,比较三个步骤。(2)关于父类传引用进入函数方法中时,不需要备份,因为子类改变的是参数列表中的指针位置。解法1-三步走(1)step1,复制树。首先得Tr...原创 2020-01-08 12:43:22 · 127 阅读 · 0 评论 -
剑指Offer-树-面试题27:二叉树的镜像
CONTENT思路解法操作给定的二叉树,将其变换为源二叉树的镜像。思路对于递归的理解还不够!解法Mirror(root.right);刚开始没加上这一行代码,递归在其执行完node.left之后会跳到node结点,然后再执行Mirror(root.right);这一句,进行右子结点的递归;nowcoder的AC提交时间:2020-01-07 ,语言:Java ,运行时间: 27 m...原创 2020-01-07 21:55:09 · 166 阅读 · 0 评论 -
剑指Offer-树-面试题26:树的子结构
CONTENT思路解法1解法2-参考输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路关于树的子结构,我们需要做的是理清楚递归。解法1/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; pu...原创 2020-01-07 20:54:33 · 139 阅读 · 1 评论 -
剑指Offer-链表-面试题52:两个链表的第一个公共结点
CONTENT思路解法输入两个链表,找出它们的第一个公共结点。思路(1)此处公共结点指的是同一个结点,而不是结点的值相同,意味着两个链表会相交。(2)第一种思路为暴力解法,在链表1中每遇到一个结点时,遍历另外一个链表。解法...原创 2020-01-06 13:56:07 · 99 阅读 · 0 评论 -
剑指Offer-链表-面试题35:复杂链表的复制
CONTENT思路解法1-哈希解法1-2解法2输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。思路(1)解法1-哈希重新建立一个链表,以及哈希表存储random指针,但是中间random指针用到了引用关系,在牛客上AC不了...原创 2020-01-04 21:23:29 · 135 阅读 · 0 评论 -
剑指Offer-链表-面试题25:合并两个排序的链表
CONTENT思路解法输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路(1)合并两个链表,特点是两个链表自身是单调递增的。(2)刚开始纠结的是头结点的处理,是初始化list1还是list2,理论上都可以,或者任意一个数字。(3)关于头结点备份的问题。这是OJ时候的主要bug,开始的时候一直是node从头结点开始赋值改变的,这样即便backu...原创 2020-01-04 18:43:59 · 103 阅读 · 0 评论 -
剑指Offer-链表-面试题24:反转链表
CONTENT思路解法1-栈输入一个链表,反转链表后,输出新链表的表头。思路(1)第一想法仍是栈的应用,栈的压栈出栈,似乎在链表非常长的情况下不友好,需要考虑手动翻转会更优。(2)wait解法1-栈nowcoder的AC提交时间:2020-01-03 ,语言:Java ,运行时间: 38 ms ,占用内存:10600K ,状态:答案正确/*public class ListNod...原创 2020-01-03 22:52:27 · 120 阅读 · 0 评论 -
剑指Offer-链表-面试题22:链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。思路(1)看到倒数第k个结点,第一反应是用栈来做中间存储,得到的是一个取巧的返回结果。不能全部AC(2)快慢指针的运用。思想学到位!解法1-栈nowcoder提交时间:2020-01-03 ,语言:Java ,运行时间: 16 ms ,占用内存:9308K ,状态:答案错误/*public class ListNode { int ...原创 2020-01-03 22:11:21 · 126 阅读 · 0 评论 -
剑指Offer-链表-面试题18-2:删除链表中的重复结点
CONTENT思路解法1解法2在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。思路本题特殊之处在于:(1)重复结点不保留,即全部删除;这就需要使用时间复杂度为O(1)的删除结点的解法。(2)重复的结点是排序好的,可能...原创 2020-01-03 11:59:26 · 132 阅读 · 2 评论 -
剑指Offer-链表-面试题18-1:在O(1)的时间内删除链表结点
CONTENT思路解法给定单向链表的头结点以及一个待删除结点,定义一个函数在O(1)时间内删除该结点。思路这一天nowcoder上面没有,就没有OJ测试了,主要是学习一下删除结点 的另外一种思路。(1)一般删除链表中的某个结点的做法都是遍历到该结点的前面,此时时间复杂度就是O(n)了,然后就是常规的curNode.next=delNode.next;delNode.next=null;si...原创 2020-01-02 22:00:44 · 94 阅读 · 0 评论 -
剑指Offer-链表-面试题23:链表中环的入口节点
CONTENT思路解法给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路(1)首先需要解决的是如何判断一个链表中有环。快慢双指针的运用,类比于速度为1和2。(2)计算出环的长度。一圈下来即为长度。(3)找到环的入口结点。双指针的运用,一个指针先出发,然后以相同的速度运动。为什么他们相遇的点就是环的起始点呢?假设链表总长度是k(k=m+n),环的长度为n,那么,...原创 2020-01-02 20:44:43 · 125 阅读 · 0 评论 -
剑指Offer-数组-面试题66:构建乘积数组
CONTENT思路解法1解法2给定一个数组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]。不能使用除法。【说明】本篇开始按照知识点来进行训练思路这道题目刚刚开始读题时很困扰,以为A[0,1,...,n-1],B[0,1,...,n-1]指的就是A,B里面的元素索引,意思就是B数组中的每...原创 2019-12-28 14:58:16 · 114 阅读 · 0 评论 -
剑指Offer-面试题15:二进制中1的个数
CONTENT思路解法输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。例如,输入9,二进制为1001,输出结果为2。思路wait解法原创 2019-12-26 22:15:31 · 107 阅读 · 0 评论 -
剑指Offer-面试题14:剪绳子
CONTENT思路解法解法1解法2思路解法解法1动态规划wait解法2贪婪算法wait原创 2019-12-26 22:12:18 · 107 阅读 · 0 评论 -
剑指Offer-面试题13:机器人的运动范围
CONTENT思路解法地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路仍旧是递归,上下左...原创 2019-12-26 15:33:03 · 171 阅读 · 0 评论 -
剑指Offer面试题12:矩阵中的路径
CONTENT思路解法判断一个字符矩阵中是否存在着一条包含某个给定字符串的路径。说明,从本道题开始使用牛客网的OJ以及参考相关大神的思路。思路考点为回溯法待编辑解法wait...原创 2019-12-26 15:02:03 · 178 阅读 · 0 评论 -
剑指Offer-面试题11:旋转数组的最小数字
CONTENT思路解法输入一个递增数组的 旋转数组(左侧若干个元素移到右边),输出该数组的最小值。思路由于是递增数列,故最小元素的左右两侧的元素均比其大;另外在二分法的指针思想中,前后两个指针不断向中间缩进,最后可以通过(end-start)==1来作为递归的终止条件。另外在寻找中间元素时,一直写的是int i=Math.round((end-start)/2-1);,运行时候都会报出数组...原创 2019-12-23 10:54:30 · 122 阅读 · 0 评论 -
剑指Offer-面试题10-2:青蛙跳台阶问题
CONTENTQ1思路Q1解法Q2思路Q2解法(Q1) 青蛙一次可以跳1个台阶,也可以跳2个台阶,求跳上n级台阶可以有多少种跳法?(Q2) 青蛙一次可以跳1个,2个…n个,求跳上n级台阶可以有多少种跳法?Q1思路通过手写一般规律发现 :n=1,c=1; n=2,c=2; n=3,c=3; n=4,c=5; n=5,c=8; n=6,c=13,得出f(n)=f(n-1)+f(n-2)。但是为...原创 2019-12-21 12:56:07 · 134 阅读 · 0 评论 -
剑指Offer-面试题10-1:斐波那契数列
CONTENT思路1求解1思路2解法2思路3解法3输入n,输出斐波那契数列值;思路1递归思想直接上线,没什么好说的。求解1/** * 面试题10-1:斐波那契数列 * 求斐波那契数列的第n项。 * n=0,f(n)=0; * n=1,f(n)=1; * n>1,f(n)=f(n-1)+f(n-2) * * @author Her...原创 2019-12-17 19:43:56 · 195 阅读 · 0 评论 -
剑指Offer-面试题9-2:用两个队列实现栈
CONTENT思路解法思路类似于用两个栈实现队列,需要反复利用。Queue与Stack不同,是一个接口,直接new是不可以的,可以借用LinkedList类,其实现了Deque接口。使用时要尽量避免Collection的add(), remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。优点是通过返回值可以判断成功与否,add()和remove()方法在...原创 2019-12-17 18:54:21 · 83 阅读 · 0 评论 -
剑指Offer-栈-面试题9-1:用两个栈实现队列
CONTENT思路求解要求实现队列的两个函数功能,尾部添加元素,头部删除元素。思路利用栈的特性,反复折腾,比较不好的情况是删除和增加元素交替进行,数据就得在两个栈之间反复循环push ,pop求解/** * 面试题9:用两个栈实现队列 * * 要求实现队列的两个函数功能,尾部添加元素,头部删除元素 * @author Heroin X * @date 2019/12/...原创 2019-12-17 13:05:50 · 148 阅读 · 0 评论 -
剑指Offer-面试题8:二叉树的下一个结点
CONTENT思路待续给定一颗二叉树和其中的一个结点,如何找出 中序遍历 序列的下一个结点?(树中的结点有3个指针分别指向左、右子结点、父结点), 给出中序遍历{d,b,h,e,i,s,f,c,g}思路(1)给定一颗二叉树和其中的一个结点,给定一颗二叉树应该是怎么给定?因为在 仅仅有中序遍历是不能得到一棵二叉树的,至少得 中序+前序/后序(why?)那么我们先假设题目的意思是 给...原创 2019-12-10 22:09:20 · 140 阅读 · 0 评论 -
剑指Offer-树-面试题7:重建二叉树
CONTENT思路解法输入某个二叉树的前序遍历、后序遍历的结果,请重建该二叉树(假设遍历结果中不包含重复元素)。前序:{1,2,4,7,3,5,6,8}—根结点 1中序:{4,7,2 ,1, 5,3,8,6}–左子树 4 7 2 —右子树 5 3 8 6思路递归对我而言比较难!明天补充。。。解法/** @author Heroin X* @date 2019/12/3 ...原创 2019-12-05 22:38:19 · 135 阅读 · 0 评论 -
剑指Offer-链表-面试题6:从尾到头打印链表
CONTENT思路解法解法1思路解法1代码解法2思路解法2代码输入一个链表的头结点,从尾到头反过来打印每个节点的值。链表节点的定义如下(略)。思路倒序输出显然想到栈结构,结合链表与栈。解法解法1思路对于输入一个链表的头结点,一直在纠结,不知道怎么处理。(1)首先是调用LinkedList问题,即便调用了,也不能new Node(), Node是一个静态内部私有类,会报 Node is...原创 2019-12-03 10:10:11 · 182 阅读 · 0 评论 -
剑指Offer-面试题5-2:合并两个有序数组
OCNTENT思路代码将第二个有序数组插入第一个有序数组中,使得最终的结果仍然有序思路参考剑指Offer-面试题5:替换空格 ,插入新元素,倒序,减少元素移动次数。这里插入条件改成判断大小的问题。代码 public void test1(int[] arr1,int[] arr2){ int len1=0; int len2=0; f...原创 2019-12-02 20:11:56 · 238 阅读 · 0 评论 -
剑指Offer-字符串-面试题5:替换空格
CONTENT思路解法解法1思路解法1代码解法2思路解法2代码解法3思路解法3代码将字符串中的空格替换成"%20 "思路第一想法使用String.replace()方法,直接解决了,那还面试啥??? 如果真想用API那麻烦把API源码写出来咯 。解法解法1思路重新构建一个数组和StringBuilder,进行拼接。解法1代码 public void test1(String...原创 2019-12-02 18:28:47 · 120 阅读 · 0 评论 -
剑指Offer-面试题4:二维数组中的查找
CONTENT分析解法解法1思路解法1代码解法2思路解法2代码解法3思路解法3代码一个二维数组,从左到右,从上到下均递增。请判断给出一个数组、数字的情况下该数是否存在分析(1)直接调用contains方法?错误: 普通数组就没有成员方法,只有成员变量,length.(2)还是遍历一遍?[q1] 普通数组为什么有length这个类似于成员变量的玩意?[q2] Array和Arrays类有...原创 2019-12-02 16:27:40 · 236 阅读 · 0 评论