√ 剑指Offer
学习ing...
阿财继续努力
学习ing...
展开
-
2021.10.25 - JZ68.II.二叉树的最近公共祖先
文章目录1. 题目2. 思路(1) DFS3. 代码1. 题目2. 思路(1) DFS首先利用深度优先搜索和栈存储从根结点到p结点的路径,由于q结点必然位于这条路径上的某个结点的子树上,因此依次弹出栈中的结点,检查q结点是否在以该结点为根的二叉树上,找到最低的一个结点返回即可。可以存储前一个被弹出的结点,检查到当前结点时,前一个被弹出的结点必然不满足要求,因此检查时可以直接排除前一个被弹出的结点。3. 代码import java.util.Deque;import java.util.原创 2021-10-25 17:50:16 · 103 阅读 · 0 评论 -
2021.10.25 - JZ68.I.二叉搜索树的最近公共祖先
文章目录1. 题目2. 思路(1) 递归(2) 迭代3. 代码1. 题目2. 思路(1) 递归首先列举所有情况:p和q的值均小于根结点的值,则p和q均在根结点的左子树中;p和q的值均大于根结点的值,则p和q均在根结点的右子树中;p和q的值一个小于根结点的值,另一个大于根结点的值,则最近公共祖先就是根结点;p和q的值一个等于根结点的值,另一个小于或大于根结点的值,则最近公共祖先也是根结点。根据列举的情况,递归查询p和q的公共祖先即可。(2) 迭代递归方法的迭代实现。3.原创 2021-10-25 17:05:59 · 94 阅读 · 0 评论 -
2021.10.25 - JZ67.把字符串转换成整数
文章目录1. 题目2. 思路(1) 模拟法3. 代码1. 题目2. 思路(1) 模拟法根据题目条件,排除所有异常情况即可。3. 代码public class Test { public static void main(String[] args) { Solution solution = new Solution(); System.out.println(solution.strToInt("words and 987")); }}原创 2021-10-25 16:27:09 · 60 阅读 · 0 评论 -
2021.10.25 - JZ66.构建乘积数组
文章目录1. 题目2. 思路(1) 乘积数组(2) 乘积数组优化3. 代码1. 题目2. 思路(1) 乘积数组根据题目要求,B中的第i个元素即为A中下标为[0,i-1]的元素的乘积再乘以下标为[i+1,n-1]的元素的乘积。创建乘积数组left和right,left[i]表示A中下标为[0,i]的元素的乘积,right[i]表示A中下标为[i,n-1]的元素的乘积,遍历两次A数组即可。再遍历一次A数组,根据B[i]=left[i-1]*right[i+1]求出B数组,左右两端的元素单独处理。原创 2021-10-25 13:46:27 · 129 阅读 · 0 评论 -
2021.10.25 - JZ65.不用加减乘除做加法
文章目录1. 题目2. 思路(1) 位运算3. 代码1. 题目2. 思路(1) 位运算两个二进制数做异或运算(^)可以得到相加后不产生进位的部分,做与运算(&)可以得到相加后产生进位的位下标,整体左移一位后可以得到相加后产生进位的部分,两个部分相加即为两数之和。以3+7,即0011+0111为例:异或运算结果为0100,与运算结果为0011,由于产生进位,则与运算结果左移一位,变成0100+0110;异或运算结果为0010,与运算结果为0100,由于产生进位,则与运算结果左移一位原创 2021-10-25 10:51:22 · 145 阅读 · 0 评论 -
2021.10.25 - JZ64.求1+2+…+n
文章目录1. 题目2. 思路(1) 逻辑运算3. 代码1. 题目2. 思路(1) 逻辑运算利用与运算(&&)的短路效应作为递归的终止条件,即当与运算的左边为false时,右边不会再计算。3. 代码public class Test { public static void main(String[] args) { }}class Solution { public int sumNums(int n) { boolean fl原创 2021-10-25 10:14:34 · 186 阅读 · 0 评论 -
2021.10.25 - JZ63.股票的最大利润
文章目录1. 题目2. 思路(1) 动态规划(2) 动态规划优化3. 代码1. 题目2. 思路(1) 动态规划最大利润是数组中所有数对的最大差值,若固定卖出价,则求最大利润的条件是知道该卖出价之前的最低买入价,即遍历第i个元素时,若知道前i-1个元素中的最小值,就可以求出在第i个元素时的最大利润,综合在所有元素能够获得的最大利润,取最大值即是整个数组的最大利润。利用一维数组存储每个元素之前的最小元素值,遍历时更新最大利润和最小元素值。(2) 动态规划优化由于计算最大利润时只用到了前一个原创 2021-10-25 09:53:12 · 105 阅读 · 0 评论 -
2021.10.24 - JZ62.圆圈中最后剩下的数字
文章目录1. 题目2. 思路(1) 递归(2) 迭代3. 代码1. 题目2. 思路(1) 递归约瑟夫环问题,递推公式为:f(n,m)=(f(n-1,m)+m)%n。推导过程较为复杂,建议背诵默写。(2) 迭代递归方法的迭代实现。3. 代码public class Test { public static void main(String[] args) { }}class Solution { private int m; public i原创 2021-10-24 22:04:57 · 65 阅读 · 0 评论 -
2021.10.24 - JZ61.扑克牌中的顺子
文章目录1. 题目2. 思路(1) 双指针法(2) 数学法3. 代码1. 题目2. 思路(1) 双指针法首先排除重复出现除0之外的数字的情况,利用两个指针表示下一个非0数字的值的范围,初始时值的范围为[1,13]。当出现1时,若要组成顺子,则之后的数字只能在[1-4,1+4]区间内,排除小于1的范围,因此值的范围更新为[1,5];当出现2时,若要组成顺子,则之后的数字只能在[2-4,2+4]区间内,该区间需要与之前的区间取交集,因此值的范围更新为[1,5];当出现6时,该数字已经不在值的范围内原创 2021-10-24 21:20:01 · 164 阅读 · 0 评论 -
2021.10.23 - JZ60.n个骰子的点数
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划假设已经知道了n-1个骰子的结果,即投掷的总点数为[n-1,6(n-1)]出现的概率,则再加一个骰子之后,若该骰子投掷的点数为1,则投掷的总点数为[n-1+1,6(n-1)+1]出现的概率均为前n-1个骰子的结果乘以1/6;若该骰子投掷的点数为2,则投掷的总点数为[n-1+2,6(n-1)+2]出现的概率为前n-1个骰子的结果乘以1/6,以此类推。显然,第n个骰子投掷的点数为1得到的总点数与投掷的点数为2原创 2021-10-23 20:53:44 · 77 阅读 · 0 评论 -
2021.10.23 - JZ59.II.队列的最大值
文章目录1. 题目2. 思路(1) 单调双端队列3. 代码1. 题目2. 思路(1) 单调双端队列利用一个正常队列执行正常的入队出队操作,利用一个单调递减的双端队列执行获取最大值的操作。每次加入元素时,不仅要加入正常队列的队尾,还要加入单调队列的队尾,这样才能保证正常队列中的最大值处于单调队列中,而为了保证单调队列单调递减的性质,需要将单调队列队尾小于该元素的元素全部弹出,此时,单调队列的队头元素是正常队列中的最大值,后面的元素均是在最大值后面入队的单调递减的元素。以正常队列[1,1,2,3原创 2021-10-23 17:58:22 · 61 阅读 · 0 评论 -
2021.10.23 - JZ59.I.滑动窗口的最大值
文章目录1. 题目2. 思路(1) 单调双端队列3. 代码1. 题目2. 思路(1) 单调双端队列根据题目要求,滑动窗口每右移一位,就会删除最左边的元素,而原来的最大值可能就是最左边的元素,因此,求滑动窗口内的最大值还需要知道滑动窗口内的次大值。设置一个单调递减的双端队列,保证队头元素是滑动窗口内的最大值,其余元素是最大值右边的单调递减的元素。每遍历一个元素,为了既能将其加入队列,又能保证队列单调递减的性质,就需要将队列中小于该元素的值全部从队尾删除,然后将该元素加入队尾。若原来的最大值等原创 2021-10-23 17:29:00 · 103 阅读 · 0 评论 -
2021.10.23 - JZ58.II.左旋转字符串
文章目录1. 题目2. 思路(1) 拼接字符串(2) 拼接字符(3) 翻转字符串3. 代码1. 题目2. 思路(1) 拼接字符串在原字符串后面拼接一个相同的字符串,取对应位置的子串返回即可。(2) 拼接字符利用StringBuilder拼接字符,对下标进行取余运算,可以在下标超出字符串长度时翻转到字符串的首部。(3) 翻转字符串先将前一部分和后一部分分别翻转,再将整体翻转即可。以abcdefg为例,分别翻转两部分得到bagfedc,再整体翻转得到cdefgab。3. 代码原创 2021-10-23 11:27:12 · 58 阅读 · 0 评论 -
2021.10.23 - JZ58.I.翻转单词顺序
文章目录1. 题目2. 思路(1) 双指针法3. 代码1. 题目2. 思路(1) 双指针法先在字符串两端各加一个空格方便操作。从后往前遍历字符串,首先让fast指针寻找单词的下一个空格,然后让slow指针指向该空格,再让fast指针寻找单词的前一个空格,最后取子串进行拼接。3. 代码public class Test { public static void main(String[] args) { }}class Solution { public St原创 2021-10-23 11:12:08 · 72 阅读 · 0 评论 -
2021.10.22 - JZ57.II.和为s的连续正数序列
文章目录1. 题目2. 思路(1) 滑动窗口3. 代码1. 题目2. 思路(1) 滑动窗口由于数组中至少包含两个数,因此数组中的值最大是target/2取上界。利用双指针法形成一个滑动窗口,计算滑动窗口内的元素之和,若元素之和等于目标值,则滑动窗口内的值构成一个结果,添加后右移右指针;若元素之和大于目标值,则减去左指针所指向的元素,并右移左指针;若元素之和小于目标值,则右移右指针,并加上右指针所指向的元素。3. 代码import java.util.ArrayList;import j原创 2021-10-22 21:51:34 · 76 阅读 · 0 评论 -
2021.10.22 - JZ57.I.和为s的两个数字
文章目录1. 题目2. 思路(1) 双指针法3. 代码1. 题目2. 思路(1) 双指针法由于数组是递增排序的,因此可以利用两个指针分别指向数组的两端,计算指针指向的元素之和。若元素之和小于目标值,则左指针右移,即可使元素之和增大;若元素之和大于目标值,则右指针左移,即可使元素之和减小。3. 代码public class Test { public static void main(String[] args) { }}class Solution { pu原创 2021-10-22 21:27:10 · 132 阅读 · 0 评论 -
2021.10.22 - JZ56.II.数组中数字出现的次数 II
文章目录1. 题目2. 思路(1) 位运算(2) 有限自动机状态机3. 代码1. 题目2. 思路(1) 位运算统计所有数字的二进制位上每一位1的个数,然后对每一位1的个数进行取余运算,不能被3整除的表示只出现了一次的数字在该位上也为1。统计出只出现了一次的数字的二进制位上每一位1的位置,逐位设置返回即可。(2) 有限自动机状态机对比二进制的异或运算,两个相同的数字异或结果为0,相当于三进制的异或运算,ones表示该数字出现一次,twos表示该数字出现两次,三个相同的数字异或结果为0,因原创 2021-10-22 14:19:12 · 66 阅读 · 0 评论 -
2021.10.22 - JZ56.I.数组中数字出现的次数
文章目录1. 题目2. 思路(1) 位运算3. 代码1. 题目2. 思路(1) 位运算考虑如果数组中除了一个数字外,其他数字都出现了两次,则异或所有数字后的结果就是只出现了一次的数字,那么如果将原数组分成两个子数组,每个子数组中除了一个数字外,其他数字都出现了两次,就可以分别找到每个子数组中只出现了一次的数字。因此,关键就在于如何将原数组分成两个符合条件的子数组。首先,将原数组的所有数字异或后得到的结果是两个只出现了一次的数字异或的结果,这个结果必然不为0,即这个结果的二进制位上必然存在1,原创 2021-10-22 13:19:45 · 74 阅读 · 0 评论 -
2021.10.22 - JZ55.II.平衡二叉树
文章目录1. 题目2. 思路(1) 前序遍历(2) 后序遍历3. 代码1. 题目2. 思路(1) 前序遍历前序遍历相当于自顶向下判断,获取左右子树的高度,若高度之差大于1,则直接返回false,否则递归判断左右子树。自顶向下的方法在计算左右子树的高度时会重复计算,第n层的结点会被重复计算n次。(2) 后序遍历后序遍历相当于自底向上判断,由于已经获取了左右子树的高度,因此只做判断即可。定义一个全局变量用于记录结果,若结果已经为false,则无需判断,直接返回即可,相当于剪枝策略。3原创 2021-10-22 12:31:43 · 77 阅读 · 0 评论 -
2021.10.22 - JZ55.I.二叉树的深度
文章目录1. 题目2. 思路(1) 层序遍历(2) 后序遍历+递归3. 代码1. 题目2. 思路(1) 层序遍历每到达一层,层数加1即可。(2) 后序遍历+递归利用递归获取左子树和右子树中较大的高度值,加1返回即可。3. 代码import java.util.LinkedList;import java.util.Queue;public class Test { public static void main(String[] args) { }}cl原创 2021-10-22 11:03:28 · 66 阅读 · 0 评论 -
2021.10.22 - JZ54.二叉搜索树的第k大节点
文章目录1. 题目2. 思路(1) 逆中序遍历3. 代码1. 题目2. 思路(1) 逆中序遍历逆中序遍历遍历二叉搜索树,找出第k个结点即可。3. 代码import java.util.Deque;import java.util.LinkedList;public class Test { public static void main(String[] args) { }}class TreeNode { int val; TreeNode l原创 2021-10-22 10:32:13 · 67 阅读 · 0 评论 -
2021.10.21 - JZ53.II.0~n-1中缺失的数字
文章目录1. 题目2. 思路(1) 二分查找3. 代码1. 题目2. 思路(1) 二分查找目标数字下标右边的值均不等于其下标,因此二分查找出第一个下标与值不匹配的下标即可。3. 代码public class Test { public static void main(String[] args) { }}class Solution { public int missingNumber(int[] nums) { int left = 0;原创 2021-10-21 19:09:56 · 82 阅读 · 0 评论 -
2021.10.21 - JZ53.I.在排序数组中查找数字 I
文章目录1. 题目2. 思路(1) 二分查找(2) 二分查找优化3. 代码1. 题目2. 思路(1) 二分查找利用二分查找找出数组中任意一个目标值的下标,然后分别向前和向后统计目标值的个数即可。(2) 二分查找优化第一次二分查找时,若中间值等于目标值,则high=mid-1,因此最后high指向小于目标值的最大值的最右边一个数字,即目标值的左边界。第二次二分查找时,若中间值等于目标值,则low=mid+1,因此最后low指向大于目标值的最小值的最左边一个数字,即目标值的右边界。最后,原创 2021-10-21 17:49:55 · 167 阅读 · 0 评论 -
2021.10.21 - JZ52.两个链表的第一个公共节点
文章目录1. 题目2. 思路(1) 双指针法(2) 双指针法优化3. 代码1. 题目2. 思路(1) 双指针法由于两个链表是尾部相交,而长度不一样,同时向后遍历会错开,因此,可以先找出长的链表,使长链表的指针先向后遍历到与短链表相等长度的位置,然后两个指针再同时向后遍历。(2) 双指针法优化根据(1)对齐链表长度的思想,可以让链表A的指针遍历完链表A之后再遍历链表B,链表B的指针遍历完链表B之后再遍历链表A,这样两个指针即使不相遇,也会同时到达null,最后返回其中的一个指针即可。原创 2021-10-21 17:11:04 · 59 阅读 · 0 评论 -
2021.10.21 - JZ51.数组中的逆序对
文章目录1. 题目2. 思路(1) 归并排序3. 代码1. 题目2. 思路(1) 归并排序利用归并排序,在合并两个有序子数组时统计逆序对的个数,关键在于合并长度大于1的子数组。根据排序规则,当子数组长度大于1时已经有序,因此以[5,7]和[4,6]为例,先利用两个指针分别指向两个子数组的头部,然后取较小元素加入合并后的数组,并且指针不断向后移动,直到合并后的数组被填满为止,具体过程如下:比较5和4,取4加入合并数组,即[4, , , ],然后向后移动指针;比较5和6,取5加入合并数组,即原创 2021-10-21 13:22:17 · 79 阅读 · 0 评论 -
2021.10.21 - JZ50.第一个只出现一次的字符
文章目录1. 题目2. 思路(1) LinkedHashMap3. 代码1. 题目2. 思路(1) LinkedHashMap利用哈希表存储字符及其是否只出现一次的状态,LinkedHashMap具有按添加顺序遍历的功能。3. 代码import java.util.LinkedHashMap;import java.util.Map;public class Test { public static void main(String[] args) { }}cl原创 2021-10-21 10:48:35 · 71 阅读 · 0 评论 -
2021.10.21 - JZ49.丑数
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(1除外)。因此,第n个丑数应该是前n-1个丑数中,乘以2、3或者5的结果中,大于第n-1个丑数且最小的一个。设置三个指针,分别指向当前乘以2、乘以3、乘以5的丑数的下标,初始均为0,每次计算时取三个结果中最小的一个作为下一个丑数,并将其下标向后移一位,如果出现多个结果相等的情况,则相等结果的下标均向后移一位。3. 代码public cla原创 2021-10-21 10:32:33 · 114 阅读 · 0 评论 -
2021.10.20 - JZ48.最长不含重复字符的子字符串
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划利用变量res记录最大无重复子串的长度,利用变量cur记录当前无重复子串的长度,利用HashMap记录出现过的字符及其最后一次出现的下标。对于下标为i的字符,若之前没有出现过,则cur直接加1即可;若之前出现过,则分为两种情况:以abcba为例,考虑下标为3的’b’:根据前一个下标的无重复字串的长度为3,可知加上’b’后得到4,但是’b’之前出现过,两个’b’之间的距离为2,小于4,因此应取较小值作为原创 2021-10-20 15:55:39 · 208 阅读 · 0 评论 -
2021.10.20 - JZ47.礼物的最大价值
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划设f(i,j)为从棋盘左上角走至单元格(i,j)的礼物最大累计价值,可得递推公式:f(i,j)=grid(i,j)+max[f(i-1,j),f(i,j-1)]。由于第一行只能从左边到达,第一列只能从上边到达,因此可以直接计算第一行和第一列的f(i,j),然后遍历其余单元格,根据递推公式计算每个单元格的f(i,j),最后返回右下角单元格的值。只能迭代计算,递归计算会超时。3. 代码public c原创 2021-10-20 13:30:44 · 168 阅读 · 0 评论 -
2021.10.20 - JZ46.把数字翻译成字符串
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划利用二维数组从后往前记录每一位数字单独翻译成字母和与前一位数字组合翻译成字母的翻译方法的个数,dp[i][0]表示单独翻译,dp[i][1]表示组合翻译。以12258为例,首先从8开始,单独翻译的方法有1种,组合翻译的方法有0种,即dp[0][0]=1,dp[0][1]=0;然后考虑5,单独翻译的方法个数是前一位数字单独翻译和组合翻译的方法个数之和,即dp[1][0]=dp[0][0]+dp[0][1]=原创 2021-10-20 11:01:33 · 156 阅读 · 0 评论 -
2021.10.19 - JZ45.把数组排成最小的数
文章目录1. 题目2. 思路(1) 快速排序3. 代码1. 题目2. 思路(1) 快速排序要想让所有数字连起来的数最小,就要使任意两个数连起来的数最小。如3和30,当3在左、30在右时,连起来的数为330,当30在左、3在右时,连起来的数为303,显然303更小,因此无论3和30在什么位置,30必须在相对于3的左边。根据上面的规则,重新定义两个数之间">=“和”<="的关系,并对数组进行快速排序,最后将数组按顺序连接成字符串返回即可。3. 代码public class Te原创 2021-10-19 21:58:09 · 208 阅读 · 0 评论 -
2021.10.19 - JZ44.数字序列中某一位的数字
文章目录1. 题目2. 思路(1) 数学法3. 代码1. 题目2. 思路(1) 数学法根据数学规律可知,个位数0-9的长度之和为(101-100)*1=10,十位数10-99的长度之和为(102-101)*2=180,百位数100-199的长度之和为(103-102)*3=2700,……,由此可以算出第n位数所在的数字是几位数。以n=194为例,得到n所在的数字是三位数,先求出n与三位数之前所有数字长度之和的差,即194-190=4,然后求出这之间包含了几个三位数,即4/3=1,再加上三位数的原创 2021-10-19 15:06:01 · 227 阅读 · 0 评论 -
2021.10.18 - JZ43.1~n 整数中 1 出现的次数
文章目录1. 题目2. 思路(1) 数学法3. 代码1. 题目2. 思路(1) 数学法以1234567为例,如果需要统计百位上数字1出现的次数,则在0-999中,数字1在百位上出现的数字有100个,即100-199,而1234567有1234567/1000=1234个完整的0-999的循环,即有1234*100=123400个100-199。然后考虑1234567%1000=567,百位上的数字可分为三种情况:百位上为0,则不存在百位上为数字1的数字;百位上为1,则有1xx-100+1原创 2021-10-18 22:40:39 · 105 阅读 · 0 评论 -
2021.10.18 - JZ42.连续子数组的最大和
文章目录1. 题目2. 思路(1) 动态规划3. 代码1. 题目2. 思路(1) 动态规划创建状态数组dp存储以下标i为结尾的连续子数组的最大和,为了保证子数组的连续性,下标为i的元素必须处于子数组中。若前一个元素的最大和小于0,则当前子数组只包含当前元素即可,否则加入前一个元素的子数组,然后计算最大和。最后统计出所有连续子数组最大和中最大的一个,返回即可。3. 代码public class Test { public static void main(String[] arg原创 2021-10-18 14:18:30 · 214 阅读 · 0 评论 -
2021.10.18 - JZ41.数据流中的中位数
文章目录1. 题目2. 思路(1) 大顶堆+小顶堆3. 代码1. 题目2. 思路(1) 大顶堆+小顶堆利用大顶堆存储小于中位数的元素,利用小顶堆存储大于中位数的元素,保持大顶堆的堆顶元素小于小顶堆的堆顶元素。插入元素时,若两个堆的元素个数相等,则先插入大顶堆,再将堆顶元素弹出插入小顶堆,避免大顶堆的堆顶元素大于小顶堆的堆顶元素;若两个堆的元素个数不等,则先插入小顶堆,再将堆顶元素弹出插入大顶堆,避免小顶堆的堆顶元素小于大顶堆的堆顶元素。根据插入规则,两个堆的元素个数要么相等,要么小顶堆的元素原创 2021-10-18 12:10:39 · 109 阅读 · 0 评论 -
2021.10.18 - JZ40.最小的k个数
文章目录1. 题目2. 思路(1) 快速排序3. 代码1. 题目2. 思路(1) 快速排序对数组进行快速排序,若选取的值正好是最小的第k个数,则直接返回其下标,不需要再对其左右进行快速排序。3. 代码import java.util.Arrays;public class Test { public static void main(String[] args) { }}class Solution { private int k; public原创 2021-10-18 10:04:06 · 61 阅读 · 0 评论 -
2021.10.18 - JZ39.数组中出现次数超过一半的数字
文章目录1. 题目2. 思路(1) 摩尔投票法3. 代码1. 题目2. 思路(1) 摩尔投票法由于众数出现的次数比其他所有数字出现的次数之和都要多,因此可以利用一个变量保存当前下标之前的众数,另一个变量保存该众数比其他数字多出现的次数,当次数为0时,将众数替换为当前下标的数字。3. 代码public class Test { public static void main(String[] args) { }}class Solution { public i原创 2021-10-18 09:44:52 · 76 阅读 · 0 评论 -
2021.10.17 - JZ38.字符串的排列
文章目录1. 题目2. 思路(1) 递归(2) 递归优化3. 代码1. 题目2. 思路(1) 递归利用ArrayList存储还未加入字符串的字符,遍历ArrayList,将每个字符都放在当前位置上,并递归其他字符。(2) 递归优化利用交换可以不用新建ArrayList。将字符串看作两部分,左边是排好序的,右边是未排序的,将右边未排序的字符依次与当前字符进行交换,然后递归处理下一个位置。回溯时需要交换回来,以便与下一个字符交换。3. 代码import java.util.Arra原创 2021-10-17 16:48:28 · 167 阅读 · 0 评论 -
2021.10.17 - JZ37.序列化二叉树
文章目录1. 题目2. 思路(1) 前序遍历3. 代码1. 题目2. 思路(1) 前序遍历利用栈实现二叉树的前序遍历,同时存储结点的值,若结点为null,则存储特殊字符’#’。反序列化时,遍历二叉树的序列化结果,利用栈存储遍历过的结点,方便回溯。3. 代码import java.util.Deque;import java.util.LinkedList;import java.util.Queue;public class Test { public static vo原创 2021-10-17 13:59:38 · 67 阅读 · 0 评论 -
2021.10.16 - JZ36.二叉搜索树与双向链表
文章目录1. 题目2. 思路(1) 中序遍历(2) 中序遍历优化3. 代码1. 题目2. 思路(1) 中序遍历首先中序遍历二叉树,将结点按照中序遍历的顺序存入ArrayList中,然后按照ArrayList中结点的顺序依次修改结点的左右指针即可。(2) 中序遍历优化在中序遍历时利用全局变量保存前一结点的引用,修改前一结点与当前结点之间的指针,然后保存当前结点的引用作为前一结点。3. 代码import sun.plugin.cache.CacheUpdateHelper;imp原创 2021-10-16 20:27:18 · 238 阅读 · 0 评论