![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
想进阿里的小菜鸡
小小菜鸡的进阶之路
展开
-
剑指 Offer 35. 复杂链表的复制
思路根据左神视频的思路来复现的。笔试代码就是用一个map来存储老链表和复制的链表,让其一一对应。代码笔试代码:/*// Definition for a Node.class Node { int val; Node next; Node random; public Node(int val) { this.val = val; this.next = null; this.random = nul原创 2022-04-25 21:50:53 · 390 阅读 · 0 评论 -
JZ71 跳台阶扩展问题
思路该题问的是有多少种方式。就是一个排列问题。那么可以尝试用背包问题来解决。又因为可以重复的上台阶,所以是一个完全背包问题。把解题的总个数target看作为背包的容量,每次迈的台阶数看做物品。这就变为一个完全背包问题求排列数的问题了。用动态规划解决1.定义dp数组的含义dp[j]表示,当有j个台阶的时候有dp[j]种方式可以登上去。2.递推公式因为是排列问题,所以递推公式就是dp[j]+=dp[j-i];注:理解不了就记住,在排列和组合问题中,递推公式一般都是它。原创 2022-04-01 20:06:11 · 251 阅读 · 0 评论 -
JZ42 连续子数组的最大和
反思自己一开始用01背包来做了,一直解决不了,最后看了题解才知道是这样写。一定要注意dp数组的定义。思路1.确定dp数组dp数组表示为当以下标为i结尾的元素的和最大。2.递推公式dp[i]=Math.max(dp[i-1]+array[i],array[i]);3.dp数组初始化dp[0]=0;4.遍历顺序由递推公式知道从前到后,正序遍历5.打印dp数组将dp数组中最大的返回即可。代码public class Solution { publi原创 2022-03-30 21:01:46 · 172 阅读 · 0 评论 -
JZ37 序列化二叉树
描述请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。二叉树的序列化(Serialize)是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树等遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#)二叉树的反序列化(Deserialize)是指:根据某种遍历顺序得到的序列化字原创 2022-01-01 21:06:03 · 673 阅读 · 0 评论 -
JZ77 按之字形顺序打印二叉树
描述给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)数据范围:0 \le n \le 15000≤n≤1500,树上每个节点的val满足|val| <= 100∣val∣<=100要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n)例如:给定的二叉树是{1,2,3,#,#,4,5}该二叉树之字形层序遍历的结果是 [[1],[3,2],[4,5]]思路自己未想出来,看的代码随想录的二叉树层次遍历写出.原创 2021-12-29 20:58:50 · 94 阅读 · 0 评论 -
JZ79 判断是不是平衡二叉树
描述输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。样例解释:样例二叉树如图,为一颗平衡二叉树注:我们约定空树是平衡二叉树。思路先一个节点一个节点的判断其是否满足平衡二叉树。如果满足就接着判断其左右孩子是否也是平衡二叉树。注:在计算左右孩原创 2021-12-12 20:18:40 · 90 阅读 · 2 评论 -
JZ8 二叉树的下一个结点
描述给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示思路1.根据给定的节点pNode找到二叉树的起始节点。2.中序遍历起始节点,将遍历的结果存在ArrayList中。3.将得到的ArrayList中取出pNode的下标,返回ArrayList中下标+1位置的节点即可。代码/*pub.原创 2021-12-11 21:11:32 · 410 阅读 · 2 评论 -
JZ33 二叉搜索树的后序遍历序列
描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。数据范围: 节点数量0 \le n \le 10000≤n≤1000,节点上的值满足1 \le val \le 10^{5}1≤val≤105,保证节点上的值各不相同要求:空间复杂度O(n)O(n),时间时间复杂度O(n^2)O(n2)提示:1.二叉搜索树是指父亲节点大于左孩子节点,但是小于右孩子节点。2.该题我...原创 2021-12-10 14:21:49 · 193 阅读 · 3 评论 -
JZ54 二叉搜索树的第k个节点
描述给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。1.返回第k小的节点值即可2.不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-13.保证n个节点的值不一样如输入{5,3,7,2,4,6,8},3时,二叉树{5,3,7,2,4,6,8}如下图所示:该二叉树所有节点按结点值升序排列后可得[2,3,4,5,6,7,8],所以第3个结点的结点值为4,故返回对应结点值为4的结点即可。思路因为是排序二叉树,只要中序遍历就会.原创 2021-12-09 21:06:18 · 218 阅读 · 2 评论 -
JZ84 二叉树中和为某一值的路径(三)
描述给定一个二叉树root和一个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 。1.该题路径定义不需要从根节点开始,也不需要在叶子节点结束,但是一定是从父亲节点往下到孩子节点2.总节点数目为n3.保证最后返回的路径个数在整形范围内(即路径个数小于231-1)思路1.遍历每个节点,以此节点为根节点开始寻找符合条件的路径2.在找路径时,只要当前路径上节点的和等于sum,就将最后的结果res+1,但是不返回,继续往下找,知道达到叶子节点,才表示该路径已经找完,才返回,原创 2021-12-09 14:34:30 · 156 阅读 · 2 评论 -
JZ86 在二叉树中找到两个节点的最近公共祖先
描述给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1和o2,请找到 o1和o2的最近公共祖先节点。思路和之前的线索树一样,我之前的线索树没有用到线索树,直接搜索的。点击下面的地址https://blog.csdn.net/weixin_56640241/article/details/121779258?spm=1001.2014.3001.5501...原创 2021-12-08 21:21:54 · 194 阅读 · 2 评论 -
JZ68 二叉搜索树的最近公共祖先
描述给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。1.对于该题的最近的公共祖先定义:对于有根树T的两个结点p、q,最近公共祖先LCA(T,p,q)表示一个结点x,满足x是p和q的祖先且x的深度尽可能大。在这里,一个节点也可以是它自己的祖先.2.二叉搜索树是若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值3.所有节点的值都是唯一的。4.p、q 为不同节点且均存在于给定的二叉搜索树中。思路代原创 2021-12-08 08:37:34 · 111 阅读 · 3 评论 -
JZ34 二叉树中和为某一值的路径(二)
描述输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点2.叶子节点是指没有子节点的节点3.路径只能从父节点到子节点,不能从子节点到父节点4.总节点数目为n思路按照前序遍历的方式遍历接点,把用count计算每个节点的值并将节点的值存入到singlePath(记录一条路径的元素)中。当走到叶子节点时,说明该通路已经走完开始进行比较。如果原创 2021-12-07 19:48:28 · 85 阅读 · 1 评论 -
JZ82 二叉树中和为某一值的路径(一)
描述给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点2.叶子节点是指没有子节点的节点3.路径只能从父节点到子节点,不能从子节点到父节点4.总节点数目为n.思路按照前序遍历遍历接点,把每个节点的值都添加到count中,当走到叶子节点时,如果count == sum就返回true,否则就返回到父节点,并且将count的值减去刚刚加入进去的值。代码impor原创 2021-12-07 16:42:37 · 472 阅读 · 13 评论 -
JZ28 对称的二叉树
描述给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)例如: 下面这棵二叉树是对称的下面这棵二叉树不对称。思路从根节点开始分为两部分,左孩子所在枝叶和右孩子所在枝叶,判断当前左右枝叶的根节点是否相等,相等则继续比较(当前左枝叶节点的的左孩子与右枝叶接点的右孩子 && 左边接点的右孩子与右边接点的左孩子)是否相等,相等则继续递归比较其孩子。如果有一个地方不等就直接返回false。代码/*...原创 2021-12-05 20:45:45 · 310 阅读 · 3 评论 -
JZ32 从上往下打印二叉树
描述不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印,跳过),请你将打印的结果存放到一个数组里面,返回。思路自己没有想出来,只会深度优先遍历,不会广度优先遍历。是真的菜啊!看了题解之后写的。先将接点node添加到队列中,使用队列先进先出的特点,将一个节点的左节点和右接点放入到队列中,并依次弹出队列,放入到list中,这样就做到的广度优先搜索了,直到队列里面的元素为空结原创 2021-12-05 19:53:26 · 621 阅读 · 1 评论 -
JZ27 二叉树的镜像
描述操作给定的二叉树,将其变换为源二叉树的镜像。数据范围:二叉树的节点数0 \le n \le 10000≤n≤1000, 二叉树每个节点的值0\le val \le 10000≤val≤1000思路就是将二叉树的左右节点进行交换就可以了。我把他单独写成一个方法,时间和空间复杂度都比较高,可以直接在Mirror中交换。代码import java.util.*;/* * public class TreeNode { * int val = 0; * Tree...原创 2021-11-28 21:09:07 · 310 阅读 · 0 评论 -
JZ55 二叉树的深度
描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1 。思路定义一个sum计算当前的深度,定义一个max计算最大的深度;然后开始遍历树,当回溯时时候,就将sum--;代码/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public Tree原创 2021-11-27 21:41:38 · 57 阅读 · 0 评论 -
JZ13 机器人的运动范围
描述地上有一个 rows 行和 cols 列的方格。坐标从 [0,0] 到 [rows-1,cols-1] 。一个机器人从坐标 [0,0] 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 threshold 的格子。 例如,当threshold为 18 时,机器人能够进入方格 [35,37] ,因为 3+5+3+7 = 18。但是,它不能进入方格 [35,38] ,因为 3+5+3+8 = 19 。请问该机器人能够达到多少个格子?思路...原创 2021-11-26 21:06:30 · 237 阅读 · 0 评论 -
JZ81 调整数组顺序使奇数位于偶数前面(二)
描述输入一个长度为 n 整数数组,数组里面可能含有相同的元素,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,对奇数和奇数,偶数和偶数之间的相对位置不做要求,但是时间复杂度和空间复杂度必须如下要求。思路一个指针从左边开始,一个从右边开始,当左指针小于右指针时,左边找到偶数的停下,右边找到奇数的停下,然后交换,知道左指针大于等于右指针为止。代码import java.util.*;public class Solution {.原创 2021-11-12 19:34:11 · 275 阅读 · 0 评论 -
JZ31 栈的压入、弹出序列
描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。思路自己想的方法无法实现,看完解析后知道的。用了一个栈来实现。先比较栈顶元素和popA中的第一个元素是否相等,不等则入栈,相等则弹出栈,并让相应的指针后移代码import java.util.*;public原创 2021-11-16 20:12:22 · 121 阅读 · 0 评论 -
JZ59 滑动窗口的最大值
描述给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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原创 2021-11-16 20:34:15 · 101 阅读 · 0 评论 -
JZ73 翻转单词序列
描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?输入:"nowcoder. a am I"返回值:"I am a nowcoder."思路1.将输入的字符原创 2021-11-16 20:46:04 · 162 阅读 · 0 评论 -
JZ9 用两个栈实现队列
描述用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。 队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。思路栈1先把元素压入栈,然后在一个一个出栈将元素压入到栈2,从栈2出栈,如果栈2出栈后还有元素剩余,就先把栈2剩余的元素压入栈1然后再在栈1中加入新的元素。代码import java.util.Stack;public class Solution { Stack<In原创 2021-11-14 20:55:18 · 352 阅读 · 0 评论 -
JZ30 包含min函数的栈
描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top和min函数操作时,栈中一定有元素。此栈包含的方法有:push(value):将value压入栈中pop():弹出栈顶元素top():获取栈顶元素min():获取栈中最小元素思路该题可以不用做,太无聊了,可以看我的文章,用数组实现的栈。数组实现栈https://blog.csdn.net/weixin_56640241/article/details/121...原创 2021-11-16 21:16:52 · 89 阅读 · 0 评论 -
JZ58 左旋转字符串
描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列 S ,请你把其循环左移 K 位后的序列输出(保证 K 小于等于 S 的长度)。例如,字符序列 S = ”abcXYZdef” , 要求输出循环左移 3 位后的结果,即 “XYZdefabc” 。思路找到要截取的部分截取为两部分然后进行拼接。代码public class Solution { public String LeftRotateStri.原创 2021-11-17 16:44:52 · 79 阅读 · 0 评论 -
JZ76 删除链表中重复的结点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5示例1输入:{1,2,3,3,4,4,5}返回值:{1,2,5}示例2输入:{1,1,1,8}返回值:{8}思路分析:首先链表是有序的,只需要比较前后节点之间是否相等,不用遍历所有节点 如果有相等的节点,则所有相等节点都删除,因此需要设置一个原创 2021-11-01 15:42:39 · 57 阅读 · 0 评论 -
JZ52 两个链表的第一个公共结点
描述输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)这个题目的描述自己没有看懂,看了好多遍还是不懂,后来去看下题解,还是不太懂题目的意思,去看看博客看懂了题目描述的意思了,然后题目看懂了,但是还是不会解题,就去看了题解,知道了思路,自己第一遍没有写出来,然后又去看了题解,才做出来!我参考的博客:https://blog.csdn.net/qq_38001377/articl...原创 2021-11-04 19:09:13 · 69 阅读 · 0 评论 -
剑指Offer JZ23 链表中环的入口结点
目录描述解题思路代码描述给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。数据范围:n\le10000n≤10000节点值范围:[1,10000]要求:空间复杂度O(1)O(1),时间复杂度O(n)O(n)例如,输入{1,2},{3,4,5}时,对应的环形链表如下图所示:可以看到环的入口结点的结点值为3,所以返回结点值为3的结点。解题思路 自己没有想出来解法,看了题解,有两种方式一种是HashMap,一...原创 2021-11-04 21:16:05 · 86 阅读 · 0 评论 -
剑指Offer JZ3 数组中重复的数字
目录描述解题思路:描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1解题思路:暴力解法:两个for循环。一个来遍历数组元素,一个用来判断现在的元素和后面的元素是否相等。import java.util.*;public class Sol原创 2021-11-05 17:15:01 · 63 阅读 · 0 评论 -
JZ72 数字在升序数组中出现的次数
目录描述思路:用暴力解法或者二分查找。我直接用的暴力解法。描述给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数数据范围:0 \le n \le 1000 , 0 \le k \le 1000≤n≤1000,0≤k≤100,数组中每个元素的值满足0 \le val \le 1000≤val≤100要求:空间复杂度O(1)O(1),时间复杂度O(logn)O(logn)思路:用暴力解法或者二分查找。我直接用的暴力解法。就是先找到第一个相...原创 2021-11-05 17:31:38 · 80 阅读 · 0 评论 -
JZ53 在排序数组中查找数字 I
目录描述思路代码描述统计一个数字在排序数组中出现的次数。思路直接暴力求解,和JZ72 数字在升序数组中出现的次数方法一样。可以参考下!代码import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @param target int整原创 2021-11-05 17:39:32 · 53 阅读 · 0 评论 -
剑指Offer JZ12 矩阵中的路径
描述请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。示例1输入:[[a,b,c,e],[s,f,c,s],[a,d,e原创 2021-11-07 15:42:12 · 137 阅读 · 0 评论 -
JZ50 第一个只出现一次的字符
描述在一个长为字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)思路:找到相同的字符,将其替换为'*',然后在替换后的字符串中,继续寻找相同的字符,最后不是*的就是单独的,再去找到第一个不是*的字符的位置返回就好了!代码public class Solution { public int FirstNotRepeatingChar(String str) { int index; ch.原创 2021-11-08 18:46:58 · 64 阅读 · 0 评论