剑指offer
小Leetcode~
这个作者很懒,什么都没留下…
展开
-
剑指offer - 正则表达式匹配
正则表达式匹配题目链接算法思路代码实现题目链接LeetCode 剑指offer - 正则表达式匹配算法思路采用递归暴力搜索的方法,把所有的方式匹配一遍,答案就出来了。递归暴力搜索比动态规划好理解多了。核心思路:通过不断的剪去 s 和 p 的首部,直到某一个或者两个都被剪空,就可以得出答案。首先,没有’*'的情况是最简单的,这时候只需要扫描一遍 s 和 p ,从首部开始比较两元素是否相同,如果相同就剪去,比较下一个即可//第i下标位置元素相同,'.'代表任何元素s.charAt(i) ==原创 2021-09-07 09:38:51 · 220 阅读 · 0 评论 -
剑指offer - 剪绳子
剪绳子题目链接算法思路贪心算法动态规划代码实现贪心实现动规实现题目链接牛客网 剑指offer - 剪绳子算法思路根据以前学过的数学知识可得,当一个数等分时,它的乘积之后是最大的。比如9,当9=3+3+3时,乘积之和333是最大的。为什么举例3?而不是其他呢?那是因为一个数最大分成3时,它的乘积才会最大。当 n=1时,没什么好分的当 n=2时,可以分成 2=1+1,但是它的乘积11=1,比2还小,还不如不分当 n=3时,可以分成3=1+2,但是它的乘积12=2,比3还小,还不如不分但是3之原创 2021-09-03 21:28:52 · 176 阅读 · 0 评论 -
剑指offer - 机器人的运动范围
机器人的运动范围题目链接算法思路代码实现题目链接牛客网 剑指offer - 机器人的运动范围算法思路这题和下面的问题的思路类似DFS模板团灭矩阵中的搜索问题都是采用dfs来解题这题很大不同的是,它并不需要撤销选择。如何判断它不需要撤销选择?就是看它走的路径是否还可以走,如果不能走了,则不需要撤销选择。就拿这题来说吧,求机器人最多能达到多少个路径?这就意味着机器人每走一格就算1,并且不能回退。这题还需要注意的点是,机器人是从(0,0)开始,意味着它只能向右或者向下,这点很重要。还有一个原创 2021-09-03 21:04:37 · 189 阅读 · 0 评论 -
剑指offer - 矩阵中的路径
矩阵中的路径题目链接算法思路代码实现题目链接牛客网 剑指offer - 矩阵中的路径算法思路这题是典型的DFS在矩阵中的搜索问题,可以参考这篇文章DFS模板团灭矩阵中的搜索问题同时这也是DFS模板套路的问题,也请参考这篇文章回溯框架团灭排列、组合、子集问题遍历矩阵,一旦某个字符等于单词的首个字符,便进入到dfs()方法中对访问过的元素标记为true,然后进入下一层dfs()在退出dfs()方法的时候,要还原代码实现import java.util.*;public clas原创 2021-09-01 21:28:34 · 78 阅读 · 0 评论 -
剑指offer - 滑动窗口中的最大值
滑动窗口中的最大值题目链接单调队列数据结构算法思路代码实现题目链接牛客网 剑指offer - 滑动窗口中的最大值LeetCode 239题 - 滑动窗口最大值单调队列数据结构所谓的单调队列和普通的双端队列没什么不同。唯一的区别就是单调队列的元素是依次递减的,就是单调队列的首元素是最大,然后依次变小。单调队列里面有三个方法:addValue(int num):添加元素,所有元素都会依次添加到队尾,但是会把前面比新元素小的元素删掉getMaxValue():返回队列中的最大元素,也就是队头元原创 2021-08-30 16:02:25 · 101 阅读 · 0 评论 -
剑指offer - 数据流中的中位数
数据流中的中位数题目链接算法思路思路一思路二代码实现实现一实现二题目链接牛客网 剑指offer - 数据流中的中位数LeetCode 295题 - 数据流的中位数算法思路思路一常规思路初始化一个集合List,将元素添加到集合里找中位数时,先对集合排序,然后判断集合的元素个数是奇数还是偶数;如果是奇数,直接取中间的数值,注意类型转换;如果是偶数,则求出中间两位数的和/2.0思路二初始化一个大顶堆和一个小顶堆小顶堆:存储所有元素中较大的一半,堆顶存储的是其中最小的元素大顶堆:存储所原创 2021-08-29 21:12:40 · 86 阅读 · 0 评论 -
剑指offer - 二叉搜索树的第k个结点
二叉搜索树的第k个结点题目链接算法思路代码实现题目链接牛客网 - 二叉搜索树的第k个结点LeerCode 230题 - 二叉搜索树中第K小的元素算法思路讲到二叉搜索树,就要联想到它的中序遍历是有序的。所以只需要中序遍历二叉搜索树,答案就显而易见了代码实现/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int原创 2021-08-28 11:10:39 · 74 阅读 · 0 评论 -
剑指offer - 序列化二叉树
序列化二叉树题目链接算法思路代码实现题目链接牛客网 剑指offer - 序列化二叉树LeetCode 剑指offer - 序列化二叉树LeetCode 297题 - 二叉树的序列化和反序列化算法思路序列化采用层序遍历的方式,对树进行一层一层的遍历。初始化一个队列,把头节点添加进去。初始化一个StringBuilder sb,储存结果值弹出队列元素,若结点不为空,则把结点的值添加到 sb 中,并且把结点的左右节点都添加到队列中;若结点为空,则在sb中放一个表示空值的字符,比如sb.appe原创 2021-08-28 10:38:15 · 88 阅读 · 0 评论 -
剑指offer - 按之字形顺序打印二叉树
按之字形打印二叉树题目链接算法思路代码实现题目链接按之字形打印二叉树算法思路BFS算法框架这题主要考查的是树的层次遍历,只要按层次遍历思路来遍历就行了!唯一不同是在添加到结果列表的时候,先判断一下是否要反转列表。通过奇偶数来判断是否要反转列表。代码实现import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null;原创 2021-08-27 20:52:21 · 76 阅读 · 0 评论 -
剑指offer - 对称的二叉树
对称的二叉树题目链接算法思路代码实现题目链接对称的二叉树算法思路不同子树下的比较就是这颗子树的左节点和另一个子树的右节点比较;这个子树的右结点和另一个子树的左节点比较。这也是镜像的特点题目给的是一个根节点,说实话并不太好比较两棵子树,这时候的思路就是增加参数。是的,重写一个方法,传入左子树和右子树,比较左子树和右子树的情况。分为以下三种:左子树为空并且右子树也为空,返回true左子树为空或者右子树为空,返回false左子树的值不等于右子树的值,返回false最后递归遍历左右子树的情况,原创 2021-08-27 20:14:50 · 60 阅读 · 0 评论 -
剑指offer - 二叉树的下一个节点
二叉树的下一个节点题目链接算法思路代码实现题目链接二叉树的下一个结点算法思路这题并不是简单地考查中序遍历,而是在理解中序遍历的基础上,明白下一个结点的位置。二叉树的下一个结点分两种情况有右结点的情况如果存在右结点,那么下一个结点必定是这个右孩子的最左结点无右结点的情况如果没有右节点,那么必须向上找第一个左节点指向的树包含该结点的祖先结点代码实现/*public class TreeLinkNode { int val; TreeLinkNode lef原创 2021-08-25 22:14:20 · 60 阅读 · 0 评论 -
剑指offer - 删除排序链表中重复的结点
删除排序链表中重复的结点题型一题目描述算法思路代码实现题型二题目描述算法思路代码实现题型一题目描述存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。返回同样按升序排列的结果链表。示例输入:head = [1,1,2]输出:[1,2]算法思路定义一个当前节点 cur 指向head如果 cur.val=cur.next.val,使 cur.next = cur.next.next;否则 cur = cur.next直到 cu原创 2021-08-25 21:34:48 · 81 阅读 · 0 评论 -
剑指offer - 链表中环的入口结点
链表中环的入口结点题目描述算法思路代码实现题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。算法思路使用快慢指针的思路,双指针技巧框架定义两个指针fast和slow快指针一次走两步,慢指针一次走一步当两个指针相遇时,慢指针回到头结点此时,快指针走一步,慢指针走一步当两个指针相遇时,就是链表中环的入口结点代码实现/* public class ListNode { int val; ListNode next = null;原创 2021-08-24 16:50:13 · 87 阅读 · 0 评论 -
剑指offer - 构建乘积数组
构建乘积数组题目描述算法思路代码实现题目描述给定一个数组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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。示例输入:[1,2,3,4,5]返回值:[120,60,40,30原创 2021-08-23 22:00:33 · 85 阅读 · 0 评论 -
剑指offer - 数组中重复的数字
数组中重复的数字题目描述算法思路代码实现题目描述在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 算法思路对于重复的问题,应该想到HashMap和HashSet两个集合。算法流程:初始化一个Hashset,记为set遍历数组,若数字在set中,直接返回,否则添加到set集合中返回原创 2021-08-23 16:32:10 · 65 阅读 · 0 评论 -
剑指offer - 不用加减乘除做加法
不用加减乘除做加法题目描述算法思路代码实现题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。示例输入:1,2返回值:3算法思路不能用常规的加减乘除,意味着这题要考察的就是位运算的应用。设两个二进制的数字为 a + b,a(i) 代表 aa 的二进制第 i 位,则有以下四种情况观察发现,无进位和 与 异或运算 规律相同,进位 和 与运算 规律相同(并需左移一位)无进位和 n 与进位 c 的计算公式如下n = a ^ b 异或运算c = (原创 2021-08-23 15:40:12 · 78 阅读 · 0 评论 -
剑指offer - 求1+2+3+...+n
求1+2+3+...+n题目描述算法思路代码实现题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。示例输入:5返回值:15算法思路这题主要考查逻辑运算短路效应。常见的逻辑运算有三种:与&&、或||、非!。其中的短路效应是指if(A && B) 如果A为false,则B的判断不会执行,直接跳过(即短路)。直接判定 A && B为falseif(原创 2021-08-23 15:20:04 · 69 阅读 · 0 评论 -
剑指offer - 圆圈中最后剩下的数字
圆圈中最后剩下的数字题目描述算法思路代码实现题目描述0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例输入: n = 5, m = 3输出: 3算法思路这里采用很常规的正向思路:定义一个列表 list,把先把 n 个元素加进来计算出下原创 2021-08-21 16:08:13 · 58 阅读 · 0 评论 -
剑指offer - 扑克牌顺子
扑克牌顺子题目描述算法思路思路一思路二代码实现实现一实现二题目描述现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。有如下规则:A为1,J为11,Q为12,K为13,A不能视为14大、小王为 0,0可以看作任意牌如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。例如:给出数据[6,0,2,0,4]中间的两个0一个看作3,一个看作5 。即:[6,3,2,5,4]这样这五张牌在[2,6]区间连续,输出true数据保证每组5个数字,原创 2021-08-20 20:16:38 · 72 阅读 · 0 评论 -
剑指offer - 翻转单词序列
翻转单词序列题目描述算法思路代码实现题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?示例输入:"nowcoder. a am I"返回值:"I am a nowcoder."原创 2021-08-20 16:32:28 · 78 阅读 · 0 评论 -
剑指offer - 左旋转字符串
左旋转字符串题目描述算法思路代码实现题目描述字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例输入: s = "abcdefg", k = 2输出: "cdefgab"算法思路最简单的思路就是利用String类中的切分子串的函数,将字符串切成两半,然后重新拼接。代码实现class Solution { public Strin原创 2021-08-20 16:22:27 · 82 阅读 · 0 评论 -
剑指offer - 和为S的两个数字
和为S的两个数字题目描述算法思路代码实现题目描述输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]算法思路看到有序的数组需要联想到双指针。定义两个指针 left=0,right=nums.length()-1sum = nums[left] + nums[right]如果sum < target,则le原创 2021-08-20 16:17:21 · 43 阅读 · 0 评论 -
剑指offer - 和为S的连续正数序列
和为S的连续正数序列题目描述算法思路代码实现题目描述输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例输入:target = 9输出:[[2,3,4],[4,5]]算法思路这道题就是滑动窗口算法的应用,可以参考一下这篇文章滑动窗口模板这道题要注意的点:left 和 right 指针是从1开始的while循环的结束条件是:target/2 +1。为什么呢?因为超过targ原创 2021-08-19 11:58:22 · 62 阅读 · 0 评论 -
剑指offer - 数组中只出现一次的两个数字
数组中只出现一次的两个数字题目描述基础补充异或(^)按位与(&)算法思路思路一思路二代码实现实现一实现二题目描述一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。示例输入:[1,4,1,6]返回值:[4,6]说明:返回的结果中较小的数排在前面基础补充异或(^)异或 xor 主要用于判断两个值是否相等0 ^ 0 = 01 ^ 0 = 10 ^ 1 = 11 ^ 1 = 0同时异或满足交换性和结合性a ^ b = b原创 2021-08-17 21:28:30 · 96 阅读 · 0 评论 -
剑指offer - 平衡二叉树
平衡二叉树题目描述算法思路代码实现题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。注:我们约定空树是平衡二叉树。示例输入:{1,2,3,4,5,6,7}返回值:true算法思路先求出左右子树的高度。参考这篇文章 二叉树深度判断左右子树的高度的绝对值是否大于1原创 2021-08-17 20:38:01 · 88 阅读 · 0 评论 -
剑指offer - 二叉树的深度
二叉树的深度题目描述算法思路思路一思路二代码实现实现一实现二题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。示例输入:{1,2,3,4,5,#,6,#,#,7}返回值:4算法思路思路一采用BFS算法思路,也就是树的层序遍历。可以参考以下文章BFS算法框架思路很简单:每遍历一层树,相应的树的深度+1思路二采用后序遍历的思路先遍历左子树,得到 left再遍历右子树,得到 right最后比较左右子树谁原创 2021-08-16 21:00:53 · 147 阅读 · 0 评论 -
剑指offer - 数字在升序数组中出现的次数
数字在升序数组中出现的次数题目描述算法思路代码实现题目描述统计一个数字在升序数组中出现的次数。示例输入:[1,2,3,3,3,3,4,5],3返回值:4算法思路这题就是二分查找算法的应用,请参考这边文章二分查找模板这道题的算法思路:查找出目标数字在数组中出现的左侧边界查找出目标数字在数组中出现的右侧边界然后右侧边界-左侧边界+1就是目标数字在升序数组中出现的次数代码实现public class Solution { public int GetNumberOfK(i原创 2021-08-16 11:36:22 · 137 阅读 · 0 评论 -
剑指offer - 两个链表的第一个公共节点
两个链表的第一个公共节点题目描述算法思路思路一思路二代码实现实现一实现二题目描述输入两个链表,找出他们的第一个公共节点如下两个链表:在节点c1开始相交算法思路思路一比较常规的思路:1.定义两个指针,分别指向两个链表,计算出两个链表的长度2. 循环两个链表,哪个链表长度比较长,就移动哪个指针,当链表长度相同时,就同时移动两个指针,直到指针指向是同一个节点,或者有一个链表为空思路二思路:定义两个指针A和B,分别指向两个链表头headA和headBA、B指针同时移动指针,当链表A为空原创 2021-08-13 19:45:03 · 104 阅读 · 0 评论 -
剑指offer - 数组中的逆序对
数组中的逆序对题目描述算法思路代码实现题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例输入: [7,5,6,4]输出: 5算法思路这道题考查的就是归并排序。在归并排序的过程中就可以计算出逆序对的总数。归并排序框架package com.sort;import java.util.Arrays;/** * 归并排序 * * @author: 小LeetCode~ **/public c原创 2021-08-12 19:51:40 · 96 阅读 · 0 评论 -
剑指offer - 第一个只出现一次的字符
第一个只出现一次的字符题目描述算法思路代码实现题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)示例输入:"google"返回值:4算法思路这道题主要是HashMap的应用。定义一个HashMap<Character,Boolean>遍历字符串,放入HashMap中。如果重复存在的字符,map.get()会返回false。只有第一次出现的字原创 2021-08-12 19:38:03 · 71 阅读 · 0 评论 -
剑指offer - 丑数
丑数题目描述算法思路代码实现丑数进阶题目描述算法思路思路一思路二代码实现实现一实现二题目描述给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。丑数 就是只包含质因数 2、3 和/或 5 的正整数。示例1输入:n = 6输出:true解释:6 = 2 × 3示例2输入:n = 8输出:true解释:8 = 2 × 2 × 2示例3输入:n = 14输出:false解释:14 不是丑数,因为它包含了另外一个质因数 7 。算原创 2021-08-11 12:20:55 · 133 阅读 · 0 评论 -
剑指offer - 把数组排成最小的数
把数组排成最小的数题目描述算法思路代码实现题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。示例输入:[3,32,321]返回值:"321323"算法思路这道题的突破口就是如何对这些数字排序?很明显,3和32来拼接,332>323的,也就是说3要排在32后面。这里涉及到的公式算法应该是这样的:x + y > y + x,那么 x 比 y 大,x原创 2021-08-10 21:07:01 · 104 阅读 · 0 评论 -
剑指offer - 整数中1出现的次数
整数中1出现的次数题目描述算法思路思路一思路二代码实现实现一实现二题目描述输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数例如,1~13中包含1的数字有1、10、11、12、13因此共出现6次示例输入:13返回值:6算法思路思路一采用暴力的方法,将每个数字转换为String,然后判断String里面是否有1,每到一个1,count就加1思路二找规律以 3210 这个数为例:3210 = 3 * 1000 + 2 * 100 + 1 * 10 + 0 * 1从千位原创 2021-08-10 20:14:21 · 103 阅读 · 0 评论 -
剑指offer - 连续子数组的最大和
连续子数组的最大和题目描述算法思路代码实现题目描述输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).示例输入:[1,-2,3,10,-4,7,2,-5]返回值:18说明:输入的数组为{1,-2,3,10,—4,7,2,一5},和最大的子数组为{3,10,一4,7,2},因此输出为该子数组的和 18。 算法思路这题是动态规划的解题思路。定义 dp [] 数组,dp[i] 表示以 array[i] 结原创 2021-08-08 21:03:56 · 112 阅读 · 0 评论 -
剑指offer - 最小的 k 个数
最小的 k 个数题目描述算法思路思路一思路二思路三代码实现实现一实现二实现三题目描述给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。0 <= k <= input.length <= 100000 <= input[i] <= 10000示例输入:[4,5,1,6,2,7,3,8],4 返回值:[1,2,3,4]说明:返回最小的4个数即可,返回[1,3,2,4]也可以算法思路思路原创 2021-08-07 21:32:27 · 83 阅读 · 0 评论 -
剑指offer - 数组中出现次数超过一半的数字
数组中出现次数超过一半的数字题目描述算法思路思路一思路二代码实现实现一实现二题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。你可以假设数组是非空的,并且给定的数组总是存在多数元素。1<=数组长度<=50000,0<=数组元素<=10000示例输入:[1,2,3,2,2,2,5,4,2]返回值:2算法思路思路一可以使用h转载 2021-08-06 20:42:48 · 54 阅读 · 0 评论 -
剑指offer - 字符串的排列
字符串的排列题目描述算法思路代码实现题目描述描述输入一个字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。示例输入:"abc"返回值:["abc","acb","bac","bca","cab","cba"]算法思路排列问题典型的思路就是采用回溯法。回溯法转载 2021-08-06 10:57:44 · 72 阅读 · 0 评论 -
剑指offer - 二叉搜索树与双向链表
二叉搜索树与双向链表题目描述算法思路代码实现题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示注意:1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继2.返回链表中的第一个节点的指针3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构算法思路其实就是线索化二叉树的变形。需要明白的一点就是,二叉搜索树的中序遍历是有序的。也就是说,这道题的大体框架就是使用中原创 2021-07-30 21:21:06 · 112 阅读 · 0 评论 -
剑指offer -复杂链表的复制
复杂链表的复制题目描述算法思路代码实现题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 下图是一个含有5个结点的复杂链表。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。示例:输入:{1,2,3,4,5,3,5,#,2,#}输出:{1,2,3,4,5,原创 2021-07-28 20:33:01 · 98 阅读 · 0 评论 -
剑指offer - 二叉树中和为某一值的路径
二叉树中和为某一值的路径题目描述算法思路代码实现题目描述输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。示例输入:{10,5,12,4,7},22返回值:[[10,5,7],[10,12]]算法思路这道题考查的就是回溯算法 + 先序遍历。我们先从根节点出发,将根节点添加到集合中,同时 target-root.val。(也就是回溯算法中的做选择)然后遍历左右子树,此时就是一个树的先原创 2021-07-27 20:32:47 · 69 阅读 · 0 评论