算法
Superbaby_0193
这个作者很懒,什么都没留下…
展开
-
剑指 Offer II 050. 向下的路径节点之和
题目描述:给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。做题记录:...原创 2022-03-02 11:32:10 · 149 阅读 · 0 评论 -
剑指 Offer II 049. 从根节点到叶节点的路径数字之和
题目描述:给定一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。每条从根节点到叶节点的路径都代表一个数字:例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。计算从根节点到叶节点生成的 所有数字之和 。叶节点 是指没有子节点的节点。提示:树中节点的数目在范围 [1, 1000] 内0 <= Node.val <= 9树的深度不超过 10做题记录:dfs遍历附上代码:public class Solu原创 2022-03-01 16:17:29 · 275 阅读 · 0 评论 -
剑指 Offer II 048. 序列化与反序列化二叉树
题目描述:序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,也可原创 2022-02-28 14:50:38 · 102 阅读 · 0 评论 -
剑指 Offer II 047. 二叉树剪枝
题目描述:给定一个二叉树 根节点 root ,树的每个节点的值要么是 0,要么是 1。请剪除该二叉树中所有节点的值为 0 的子树。节点 node 的子树为 node 本身,以及所有 node 的后代。提示:二叉树的节点个数的范围是 [1,200]二叉树节点的值只会是 0 或 1做题记录:...原创 2022-02-25 11:23:34 · 505 阅读 · 0 评论 -
剑指 Offer II 046. 二叉树的右侧视图
题目描述:给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例 1:输入: [1,2,3,null,5,null,4]输出: [1,3,4]示例 2:输入: [1,null,3]输出: [1,3]示例 3:输入: []输出: []提示:二叉树的节点个数的范围是 [0,100]-100 <= Node.val <= 100 做题记录:1 借助队列做层序遍历,解题思路和44,45题一致。附上代码:原创 2022-02-25 11:13:21 · 287 阅读 · 0 评论 -
剑指 Offer II 045. 二叉树最底层最左边的值
题目描述:给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。示例 1:输入: root = [2,1,3]输出: 1示例 2:输入: [1,2,3,4,null,5,6,null,null,7]输出: 7 提示:二叉树的节点个数的范围是 [1,104]-231 <= Node.val <= 231 - 1 做题记录:1.借助队列做层序遍历,和44题的解题思路一样,只是让返回的内容不一样而已。附上代码:p原创 2022-02-24 17:40:52 · 614 阅读 · 0 评论 -
剑指 Offer II 044. 二叉树每层的最大值
题目描述:给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。示例1:输入: root = [1,3,2,5,3,null,9]输出: [1,3,9]解释: 1 / \ 3 2 / \ \ 5 3 9 示例2:输入: root = [1,2,3]输出: [1,3]解释: 1 / \ 2 3示例3:输入: ro原创 2022-02-23 14:19:57 · 206 阅读 · 0 评论 -
剑指 Offer II 043. 往完全二叉树添加节点
题目描述:完全二叉树是每一层(除最后一层外)都是完全填充(即,节点数达到最大,第 n 层有 2n-1 个节点)的,并且所有的节点都尽可能地集中在左侧。设计一个用完全二叉树初始化的数据结构 CBTInserter,它支持以下几种操作:CBTInserter(TreeNode root) 使用根节点为 root 的给定树初始化该数据结构;CBTInserter.insert(int v) 向树中插入一个新节点,节点类型为 TreeNode,值为 v 。使树保持完全二叉树的状态,并返回插入的新节点的父节原创 2022-02-23 11:58:51 · 74 阅读 · 0 评论 -
剑指Offer II 042. 最近请求次数
题目描述:写一个 RecentCounter 类来计算特定时间范围内最近的请求。请实现 RecentCounter 类:RecentCounter() 初始化计数器,请求数为 0 。int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。保证 每次对 ping 的调用都使用比之前更大的 t 值。示例:输入:inputs = ["Re原创 2022-02-22 19:46:31 · 90 阅读 · 0 评论 -
剑指 Offer II 041. 滑动窗口的平均值
题目描述:给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算滑动窗口里所有数字的平均值。实现 MovingAverage 类:MovingAverage(int size) 用窗口大小 size 初始化对象。double next(int val) 成员函数 next 每次调用的时候都会往滑动窗口增加一个整数,请计算并返回数据流中最后 size 个值的移动平均值,即滑动窗口里所有数字的平均值。示例:输入:inputs = ["MovingAverage", "next", "nex原创 2022-02-22 11:54:28 · 85 阅读 · 0 评论 -
剑指 Offer II 040. 矩阵中最大的矩形
题目描述:给定一个由 0 和 1 组成的矩阵 matrix ,找出只包含 1 的最大矩形,并返回其面积。注意:此题 matrix 输入格式为一维 01 字符串数组。示例 1:输入:matrix = ["10100","10111","11111","10010"]输出:6解释:最大矩形如上图所示。示例 2:输入:matrix = []输出:0示例 3:输入:matrix = ["0"]输出:0示例 4:输入:matrix = ["1"]输出:1示例 5:输入:mat原创 2022-02-21 13:51:21 · 192 阅读 · 0 评论 -
剑指 Offer II 039. 直方图最大矩形面积
给定非负整数数组 heights ,数组中的数字用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。示例 1:输入:heights = [2,1,5,6,2,3]输出:10解释:最大的矩形为图中红色区域,面积为 10示例 2:输入: heights = [2,4]输出: 4提示:1 <= heights.length <=1050 <= heights[i] <= 104做题记录:1.和38题原创 2022-02-19 21:53:04 · 126 阅读 · 0 评论 -
剑指 Offer II 038. 每日温度
题目描述:请根据每日 气温 列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。示例 1:输入: temperatures = [73,74,75,71,69,72,76,73]输出: [1,1,4,2,1,1,0,0]示例 2:输入: temperatures = [30,40,50,60]输出: [1,1,1,0]示例 3:输入: temperatures =原创 2022-02-19 20:32:21 · 7731 阅读 · 0 评论 -
剑指 Offer II 037. 小行星碰撞
题目描述:给定一个整数数组 asteroids,表示在同一行的小行星。对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相同的速度移动。找出碰撞后剩下的所有小行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。示例 1:输入:asteroids = [5,10,-5]输出:[5,10]解释:10 和 -5 碰撞后只剩下 10 。 5 和原创 2022-02-19 19:48:08 · 54 阅读 · 0 评论 -
剑指 Offer II 036. 后缀表达式
题目描述:根据 逆波兰表示法,求该后缀表达式的计算结果。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。逆波兰表达式:逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )原创 2022-02-18 14:02:39 · 50 阅读 · 0 评论 -
剑指 Offer II 035. 最小时间差
题目描述:给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。做题记录:1:时间点最多只有24 * 60个,所以当时间点多于24 * 60的时候,说明一定有重复的时间点,那么最小时间差为0;2:把24小时制的时间修改为分钟制,转换方程为分钟数=小时*60+分钟,然后对分钟数进行排序(从小到大排列)3:把最小的时间加上24 * 60,解决最大值和最小值之间差值的这种情况,比如[“23:59”,“00:00”];这一点非常巧妙,刚开始想的原创 2022-02-17 16:46:41 · 177 阅读 · 0 评论 -
剑指 Offer II 034. 外星语言是否排序
题目描述:某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外星语中按字典序排列时,返回 true;否则,返回 false。做题记录:这一道题可以理解为排序字母的变种题目,如果说正常的排序题目是按照26个英文字母正常排序,那么“外星语言”则是有他们自己特殊的字母排序;在正常排序的时候,我们是按照字母的ASCII码来进行比较,那么在“外星语言的”环境下原创 2022-02-17 15:04:41 · 243 阅读 · 0 评论 -
剑指 Offer II 033. 变位词组
题目:给定一个字符串数组 strs ,将 变位词 组合在一起。 可以按任意顺序返回结果列表。注意:若两个字符串中每个字符出现的次数都相同,则称它们互为变位词。做题记录:做题前:本来不确定这一个字符串数组中是否包含相同的字符串,看了题解应该是不包括相同的字符串的;这样就容易多了1.使用Map数据结构,key是字符排序之后的String,value是一组变位词。2.遍历数组中的元素,对字符排序map中查找是否存在相应的key,如果存在直接取出value中的list,添加当前元素即可,如果不存在,则新原创 2022-02-15 16:16:15 · 247 阅读 · 0 评论 -
剑指 Offer II 029. 排序的循环链表
做题记录:提交了若干次才成功的一道题。如果链表是空链表,直接构造一个节点,指向自己,返回即可。如果链表非空,有可能是递增,也有可能链表中所有的值相等如果链表是递增的,值可能介于最大和最小值中间,也有可能小于最小值,也有可能大于最大值3.1 如果插入值介于最大和最小值中间,那么这种情况直接找>=前面的元素值并且<=后面的元素值的位置即可3.2 如果插入值小于最小值或者大于最大值,那么需要找到最小值和最大值的位置,并且把插入值插入这两个位置之间即可假如链表中所有的值相等,如果插入值等原创 2022-02-14 19:50:39 · 121 阅读 · 0 评论 -
剑指 Offer II 032. 有效的变位词
做题记录:solution1:使用两个长度为26的整数数组来记录字符出现的次数,最后判断两个整数数组是否相同;solution2:使用一个长度为26的整数数组,一个用++,一个用–,最后判断整数数组的每一位元素是否为0;solution3:将两个字符串转换为字符数组,对字符数组进行排序,然后判断两个字符数组是否相同。solution1代码:...原创 2022-02-11 11:49:00 · 320 阅读 · 0 评论 -
剑指 Offer II 027. 回文链表
做题记录:solution1:把链表内容保存到数组或者list集合中,使用双指针的方法判断solution2:快慢指针+链表反转+比较的方式判断附代码:public static boolean isPalindrome(ListNode head) { //快慢指针+反转链表 //1 2 3 2 1 //切割之后 1 2 3 / 2 1 //反转之后 1 2 3 / 1 2 或者把后面的放到栈中 //从头开始比较 if (head == null |原创 2022-02-10 17:19:12 · 231 阅读 · 0 评论 -
剑指 Offer II 026. 重排链表
做题记录快慢指针+反转链表+合并链表代码实现:public void reorderList(ListNode head) { if(head==null || head.next==null || head.next.next==null){ return; } ListNode pre = new ListNode(0, head); ListNode fast = pre, slow = pre; while (fast != null &原创 2022-02-09 19:14:34 · 182 阅读 · 0 评论 -
剑指 Offer II 025. 链表中的两数相加
做题记录solution1:直接计算出l1和l2数据之和,然后构造链表,这种情况可能会越界,因为列表的长度最长可以为100solution2:反转列表,然后从个位开始逐个相加solution3:不反转,使用栈使用solution2的思想实现了第一步:借助24题的实现反转l1和l2,p和q指针分别指向反转之后的l1和l2的首节点;第二步:构造变量catch,用来存储进位,在p != null 或者q != null 或者catch != 0的情况下计算节点数值和进位的和sum;第三步:构造节点L原创 2022-02-09 16:42:10 · 304 阅读 · 0 评论 -
剑指 Offer II 024. 反转链表
做题记录:使用迭代的方式反转构建节点pre=null, cur=head, next=head.next.先反转第一个节点,直接使当前节点指向pre,然后当前节点指向cur,cur指向next,next节点指向下一个节点。直到next节点指向null.初始化状态p c nn 1->2->3中间态p c nn<-1 2->3 p c nn<-1 2->3->null p c nn<-1<-2 3-&g原创 2022-02-09 15:15:29 · 299 阅读 · 0 评论 -
剑指 Offer II 023. 两个链表的第一个重合节点
做题记录方法1:使用map,把链表1的节点存放在map中,然后遍历链表2的节点,查找map中是否存在方法2:使用双指针两个指针分别指向两个链表的头结点假如链表A重合之前有a个节点,链表B重合之前有b个节点,两个链表重合的部分有c个节点,那么链表A的长度m=a+c,链表B的长度n=b+c同时,逐步后移两个指针,如果两个链表有重合节点,如果a=b,两个指针会同时到达重合节点;如果a!=b,当指针A指向null的时候,指向headB重新开始移动;当指针B指向null的时候,重新指向headA重原创 2022-02-09 11:50:52 · 334 阅读 · 0 评论 -
剑指 Offer II 021. 删除链表的倒数第 n 个结点
做题记录:1.本题使用双指针的思想2.非常巧妙的增加dummy节点,这样即使倒数第n个节点是head,也可以通用dummy节点的创建ListNode dummy = new ListNode(0,head);3.左右指针初始化,左指针指向dummy,右指针指向head;4.先将右指针右移n个节点5.之后,同时移动左右指针,直到右指针指向null6.这时候,左指针指向的是要删除的节点的前一个节点7.通过node.next=node.next.next把倒数第n个节点删除附上代码实现:pub原创 2022-02-08 18:11:10 · 179 阅读 · 0 评论 -
剑指 Offer II 020. 回文子字符串的个数
做题记录使用中心线法,有n个字符,则有2*n-1个中心线在中心线法的基础上使用双指针。左指针指向左边的字符,右指针指向右边的字符,如果左右指针指向的字符相同,则计数+1;并且作指针继续向左边移动,右指针继续向右移动,直到左右指针越界(左指针<0或者右指针>=字符串的长度)或者左右指针所指向的字符不相同。如果是以字母作为中心线,则默认有一个回文字符串,就是当前字符本身。附上代码:public static int countSubstrings(String s) {cha原创 2022-02-08 15:30:58 · 273 阅读 · 0 评论 -
剑指 Offer II 019. 最多删除一个字符得到回文
做题记录1.这是一道双指针题目2.左指针指向左边界,右指针指向右边界,判断左右指针所指向的字符是否相同。相同的情况下,移动左右指针;不相同的情况下,要么去掉左边指针所指向的字符,要么去掉右边指针所指向的字符,判断是否有能得到回文的情况,只要有1种情况能得到回文就符合要求。附上代码:public boolean validPalindrome(String s) { char[] chars = s.toCharArray(); int left = 0; int right原创 2022-02-08 14:56:55 · 378 阅读 · 0 评论 -
剑指 Offer II 018. 有效的回文
做题记录:去掉不合要求的字符判断去掉不符合要求的字符之后的字符串是否是回文字符串即可。判断是否是回文字符串的方法:可以使用StringBuffer的reverse方法,判断反转前后字符是否相等。...原创 2022-02-02 19:19:46 · 163 阅读 · 0 评论 -
剑指 Offer II 016. 不含重复字符的最长子字符串
做题记录这道题是使用滑动窗口实现的,滑动窗口边界的获取是通过哈希表获取的;这道题的难点是左边界的维护,需要保持滑动窗口中没有重复的字符,left = Math.max(left,map.get(s.charAt(i))+1),自己做的时候,只维护了left = map.get(s.charAt(i)+1),后来发现针对’abba’这种字符串是有问题的;不含重复字符的最长子字符串长度是通过ans = Math.max(ans,i-left+1)来获取的。...原创 2022-01-31 12:42:52 · 382 阅读 · 0 评论 -
剑指 Offer II 013. 二维子矩阵的和
做题记录添加辅助矩阵本题使用了二维前缀和的概念二维前缀和的计算sums[i+1][j+1] = sum + sums[i][j+1];如何通过二维前缀和矩阵得到二维子矩阵的和?假如左上矩阵的坐标为(i1,j1),右下矩阵的坐标为(i2,j2)那么通过sums[i2+1][j2+1] - sums[i1][j2+1]-sums[i2+1][j2]+sums[i1][j1]来得到子矩阵的和。...原创 2022-01-30 13:09:00 · 900 阅读 · 0 评论 -
剑指 Offer II 014. 字符串中的变位词
做题记录本题是字符串的题目,但是实际上使用了双指针的思想,有一篇题解写的非常棒,是对字符串的题目类型的总结,有时间的时候可以认真研究一下,转换为自己的东西;使用了双指针的思想,且双指针之间的长度固定;非常巧妙的进行了转化,将字符串->字符->整数将字符串转换为整数数组,转换为判断整数数组是否相同;这就是非常巧妙的使用了int[] nums = new int[26];注意细节的处理,最后不是直接返回false,而是返回Arrays.equals(array1,array2);因为如原创 2022-01-30 11:04:42 · 743 阅读 · 0 评论 -
剑指 Offer II 012. 左右两边子数组的和相等
1.首先使用Arrays.stream(nums).sum()来计算数组所有元素之和2.非常巧妙的一点是没有使用除法,而是使用乘法和加法在确定中心下标。原创 2022-01-29 13:28:24 · 130 阅读 · 0 评论 -
剑指 Offer II 011. 0 和 1 个数相同的子数组
做题记录1.本题和第10题相似,也是使用了前缀和的概念;2.特别巧妙的一个做法是,把其中的0换成-1,这样如果数组中包含的0和1的个数相同,那么其前缀和就是0;3.使用的数据结构Map<Integer,Integer>其中key代表的是前缀和value代表的是该前缀和最靠前的索引所以初始化的时候map.put(0,-1)0前面的“索引”为-1在索引相同的情况下,Math.max(max,当前索引-最靠前的索引)这样可以得到最长的数组长度...原创 2022-01-29 11:33:50 · 446 阅读 · 0 评论 -
剑指 Offer II 010. 和为 k 的子数组
做题记录:1.因为测试样例中有负例,所以不能使用滑动窗口来进行解决2.这道题中使用了前缀和的概念通过前缀和的差值来得出各个区间的和值3.数据结构:使用了map数据结构,来保存当前元素之前前缀和出现的次数信息,并且初始化就添加map.put(0,1)...原创 2022-01-29 10:59:13 · 497 阅读 · 0 评论