![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
剑指Offer
剑指offer题解,手撕代码
Teamo.Q
这个作者很懒,什么都没留下…
展开
-
【手撕代码】剑指offer-滑动窗口内的最大值
描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6原创 2021-06-17 21:07:20 · 63 阅读 · 0 评论 -
【手撕代码】剑指offer-字符流中第一个不重复的字符
描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。后台会用以下方式调用Insert 和 FirstAppearingOnce 函数string caseout = "";1.读入测试用例字符串casein2.如果对应语言有Init()函数的话,执行Init() 函数3.循环遍历字符串里的每一个字符ch {Insert(ch);c原创 2021-06-17 20:52:33 · 90 阅读 · 0 评论 -
【手撕代码】剑指offer-数据流的中位数
描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。解题思路计算数据流的中位数难点:数据流是一个动态的数据,在求解中位数时需要考虑动态排序计算当前位置中位数。二叉平衡树可以针对数据流实现实现动态排序,但传统的二叉平衡树只会考虑左右子树的深度导致树失去平衡,本题所面对的场景原创 2021-06-17 08:58:24 · 70 阅读 · 0 评论 -
【手撕代码】剑指offer-复制复杂链表
描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路重点难点:复制出来的链表的随机指针如何完成复制, 复制时有的结点可能还未生成。因此我们需要先将这些节点复制出来,然后再完成随机指针映射,此时的关键是怎么才可以最快找到随机指针指向的结点。在此记录一种解法:复制链表中所有结点并将新的结点插入原结点下一位置初原创 2021-06-16 08:15:20 · 57 阅读 · 0 评论 -
【手撕代码】剑指offer-二叉树中和为某一值的路径
描述输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。示例1输入:{10,5,12,4,7},22返回值:[[10,5,7],[10,12]]示例2输入:{10,5,12,4,7},15返回值:[]import java.util.List;import java.util.ArrayList;import java.util.Stack;import java.util.原创 2021-06-13 19:03:39 · 52 阅读 · 0 评论 -
【手撕代码】剑指offer-入栈与出栈顺序匹配
描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)示例1输入:[1,2,3,4,5],[4,3,5,1,2]返回值:falseimport java.util.Stack;public class Solution { publi原创 2021-06-13 18:26:40 · 112 阅读 · 0 评论 -
【手撕代码】剑指offer-包含min函数的栈
描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。import java.util.Stack;public class Solution { private Stack<Integer> data=new Stack<>(); private Stack<Integer> min=new Stack<>(); public void push(int node原创 2021-06-13 18:12:59 · 65 阅读 · 0 评论 -
【手撕代码】剑指offer-二叉树镜像
描述操作给定的二叉树,将其变换为源二叉树的镜像。比如: 源二叉树8/ 6 10/ \ / 5 7 9 11镜像二叉树8/ 10 6/ \ / 11 9 7 5示例1输入:{8,6,10,5,7,9,11}返回值:{8,10,6,11,9,7,5}import java.util.*;/* * public class TreeNode { * int val = 0; * TreeNode left = null; *原创 2021-06-13 17:58:57 · 86 阅读 · 0 评论 -
【手撕代码】剑指offer-树的子结构
描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)示例1输入:{8,8,#,9,#,2,#,5},{8,9,#,2}返回值:true解题思路从根节点开始比较,如果根节点相等则判断左右子树是否相等从根节点比较不相等,则从左右孩子开始查找子树,重复步骤1/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;原创 2021-06-13 13:19:07 · 84 阅读 · 0 评论 -
【手撕代码】剑指offer-合并两个有序链表
描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。示例1输入:{1,3,5},{2,4,6}返回值:{1,2,3,4,5,6}/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public Lis原创 2021-06-13 12:14:01 · 122 阅读 · 0 评论 -
【手撕代码】剑指offer-翻转链表
描述输入一个链表,反转链表后,输出新链表的表头。示例1输入:{1,2,3}返回值:{3,2,1}解题思路新建一个链表,将原链表中所有节点依次插入新链表中/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode Re原创 2021-06-13 12:02:11 · 78 阅读 · 0 评论 -
【手撕代码】剑指offer-链表中倒数最后k个结点
描述输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为 0 的链表。示例1输入:{1,2,3,4,5},1返回值:{5}解题思路使用两个指针,一个快指针和一个慢指针,这两个指针相距K个元素,当快指针走到链表尾部时便得到最后K个元素import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; *原创 2021-06-13 11:47:56 · 74 阅读 · 0 评论 -
【手撕代码】剑指offer-调整数组顺序使得所有奇数位于偶数前面并不改变原有数的顺序
描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。示例1输入:[1,2,3,4]返回值:[1,3,2,4]示例2输入:[2,4,6,5,7]返回值:[5,7,2,4,6]解题思路似曾相似的感觉,将所有满足某个条件的数移动数组指定位置区间,同时将不满足该条件的元素移动至数组另一部分,这不就是快速排序核心思想的一部分吗?因此有了如下解题方法:import ja原创 2021-06-13 11:35:48 · 93 阅读 · 0 评论 -
【手撕代码】剑指offer-数值的整数次方
描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。示例1输入:2.00000,3返回值:8.00000示例2输入:2.10000,3返回值:9.26100示例3输入:2.00000,-2返回值:0.25000说明:2的-2次方等于1/4=0.25解题思路如果exponent<0,将幂转原创 2021-06-13 10:38:39 · 51 阅读 · 0 评论 -
【手撕代码】剑指offer-二进制中的1的个数
描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。示例1输入:10返回值:2Solutions求解整数二进制,然后统计1的个数使用mark=0x01进行与操作,然后右移mark一位继续与操作,直到mark等于0为止举个例子val=10011,val-1=10010,val&(val-1)=10010…val-1=10001,val&(val-1)=10000public class Solution { public int Numb原创 2021-06-11 09:09:10 · 60 阅读 · 0 评论 -
【手撕代码】剑指offer-矩形覆盖
描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,从同一个方向看总共有多少种不同的方法?比如n=3时,2*3的矩形块有3种不同的覆盖方法(从同一个方向看):输入描述:2 X 1的小矩形的总个数n返回值描述:覆盖一个2 X n的大矩形总共有多少种不同的方法(从同一个方向看)示例1输入:0返回值:0示例2输入:1返回值:1示例3输入:4返回值:5public class Solution { pub原创 2021-06-11 08:53:24 · 45 阅读 · 0 评论 -
【手撕代码】剑指offer-跳台阶问题扩展
描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。示例1输入:3返回值:4Solutionspublic class Solution { public int jumpFloorII(int target) { if(target<1){ return 0; } // 到达第一个台阶的方法只有1种 int result=1;原创 2021-06-10 22:55:25 · 95 阅读 · 2 评论 -
【手撕代码】剑指offer-跳台阶
描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。public class Solution { public int jumpFloor(int target) { if(target<1){ return 0; } int[] data=new int[target+1]; data[0]=1; data[1]=原创 2021-06-10 22:40:19 · 46 阅读 · 0 评论 -
【手撕代码】剑指offer-斐波那契数列
描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n≤39示例1输入:4返回值:3解题思路第0项为0,第1项是1,当n>=2时为前两项之和,即fibonacct[n]=fibonacct[n-1]+fibonacct[n-2]public class Solution { public int Fibonacci(int n) { if(n==0||n==1){ re原创 2021-06-10 22:32:22 · 87 阅读 · 0 评论 -
【手撕代码】剑指offer-旋转数组的最小值
描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。示例1输入:[3,4,5,1,2]返回值:1解题思路可以暴力搜索整个数组时间复杂度:O(N)空间复杂度:O(1)利用题目有效信息:原数组为非递减数组(有相同元素值数组或者递增数组),即可以理解为一个有序数组,有序数组查找可以考虑二分查找,二分查找的关键是总可以把目标集分割两部分,同时分割出来的原创 2021-06-10 21:15:36 · 79 阅读 · 0 评论 -
【手撕代码】剑指offer-用两个栈实现队列
描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路栈操作的特点:先进后出队列操作的特点:先进先出如果用栈实现队列则需要将栈中的所有元素出栈一次从而拿到最先入栈的那个元素,入栈操作则需要将上述过程反转过来才可以将元素放到队列尾部。那什么情况下可以不这么复杂,正好此处有两个栈,那么他们可不可以一个负责队列入队offer操作,一个负责队列出队poll操作。import java.util.Stack;public class Solution {原创 2021-06-10 20:38:26 · 66 阅读 · 0 评论 -
【手撕代码】剑指offer-重建二叉树
描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。示例1输入:[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]返回值:{1,2,5,3,4,6,7}输出说明:重建二叉树之后分层遍历结果解题思路前序遍历第一个节点为根节点,中序遍历根节点左右两边元素为左子树中序遍历和右子树中序遍历,同时前序遍原创 2021-06-10 09:32:14 · 58 阅读 · 0 评论 -
【手撕代码】剑指offer-二维数组查找
描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]给定 target = 7,返回 true。给定 target = 3,返回 false。示例1输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]原创 2021-06-10 08:03:25 · 71 阅读 · 0 评论 -
【手撕代码】剑指offer-从尾到头打印链表
描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。示例1输入:{67,0,24,58}返回值:[58,24,0,67]解题思路顺序遍历链表,使用栈记录遍历过程,然后元素出栈顺序便是结论/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;*原创 2021-06-10 08:34:04 · 64 阅读 · 0 评论 -
【手撕代码】剑指offer-空格替换
描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。示例1输入:“We Are Happy”返回值:“We%20Are%20Happy”解题思路使用Java String类工具方法replaceAll拼接字符串,即遍历字符串数组,替换目标字符import java.util.*;public class Solution { /** * 代码中的类名、原创 2021-06-10 08:19:00 · 48 阅读 · 0 评论