自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

谜底的博客

我迷恋的时光自天空倾倒

  • 博客(292)
  • 资源 (1)
  • 收藏
  • 关注

原创 leetcode199 二叉树的右视图

上面的代码再解释下,因为递归先遍历的时右子树,在根节点的时候,深度为0,结果集的长度也为0,所以把根节点的值加入结果集;加一个depth参数就可以。还有一种更为巧妙的方法是,使用递归法,先递归右子树,再递归左子树,同时在递归的时候在多传一个参数是二叉树的深度,当深度等于答案结果集的长度时,就将此时递归到的节点追加到答案中。给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。输入: [1,2,3,null,5,null,4]输出: [1,3,4]

2024-04-16 07:39:55 186

原创 leetcode143 重排链表

这道题相当于三题合一,先通过快慢指针找到链表的中间节点,然后反转中间节点到末尾的这一段链表,再然后遍历,将每个节点的next指向合适的位置即可。不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

2024-04-15 08:45:58 97

原创 leetcode34 在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。首先递增有序数组,要想到二分法,这道题可以用左闭右开的方法来求出最开始的位置;输入:nums = [5,7,7,8,8,10], target = 8。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。如果数组中不存在目标值 target,返回 [-1, -1]。

2024-04-03 09:21:17 160

原创 leetcode 303 前缀和 区域和检索

这种题目其实也是可以自己想出来的,他要求数组中间某个范围的和,那大概率就是用类似于右边界的和减去左边界的和, 就可以求得中间环节的和;int sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 nums[left] + nums[left + 1] + …计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left

2024-03-18 09:15:11 151

原创 leetcode2171 拿出最少数目的魔法豆

请你从每个袋子中 拿出 一些豆子(也可以 不拿出),使得剩下的 非空 袋子中(即 至少还有一颗 魔法豆的袋子)魔法豆的数目 相等。一旦把魔法豆从袋子中取出,你不能再将它放到任何袋子中。这道题目题意上还是不太好理解的,最后要的结果是数组中的每个数据,要么是0,不为0的都应该相等。最后要求的是取出最少的豆子数目,转化一下求剩余最多的豆子。给定一个 正整数 数组 beans ,其中每个整数表示一个袋子里装的魔法豆的数目。总共拿出了 1 + 2 + 1 = 4 个魔法豆,剩下非空袋子中魔法豆的数目相等。

2024-01-23 09:03:22 411

原创 leetcode2744 最大字符串配对数目

给你一个下标从 0 开始的数组 words ,数组中包含 互不相同 的字符串。输入:words = [“cd”,“ac”,“dc”,“ca”,“zz”]字符串 words[i] 等于 words[j] 的反转字符串。请你返回数组 words 中的 最大 匹配数目。注意,每个字符串最多匹配一次。

2024-01-23 08:15:30 478

原创 leetcode二叉树系列通用输入定义

日常我们在leetcode上刷题的时候,都是核心代码模式,并不知道如何构造参数,以及自己写输入输出调试的时候该如何处理,在这里进行一个整理。

2023-10-24 08:48:03 184

原创 各种排序算法实现

【代码】各种排序算法实现。

2023-10-18 21:04:57 146

原创 leetcode二叉树系列参数构造

【代码】leetcode二叉树系列参数构造。

2023-10-18 21:03:54 131

原创 链表系列参数构造完整代码

【代码】链表系列参数构造完整代码。

2023-10-18 21:02:43 98

原创 相向双指针 leetcode42 接雨水

如果不想开辟两个新组数,那么就使用两个单纯的指针,分别从左右开始遍历,那么此刻我们知道,比如左右都遍历了两个位置,那么中间位置的容量我们是不知道的,但是如果前缀最大值比后缀最大值小,那么左边木桶的容量就是前缀最大值的容量,算完后向右扩展;解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]

2023-10-08 12:13:22 162 1

原创 leetcode64 最小路径和

题目中说了只能向下或者向右,那么就是:dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]dp[i][j]表示走到grid[i][j]的时候最小路径和为dp[i][j]输入:grid = [[1,3,1],[1,5,1],[4,2,1]]除了dp[0][0]需要初始化之外,第一行和第一列也需要初始化,这道题现在看来会相对简单一些,使用动规五部曲直接分析一下就行。解释:因为路径 1→3→1→1→1 的总和最小。说明:每次只能向下或者向右移动一步。

2023-10-07 20:54:16 198

原创 leetcode 221 最大正方形 + 1277 统计全为1的正方形子矩阵

输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]dp[i][j]:代码下标为i-1,j-1位置为右下角的正方形,最大面积为dp[i][j]。在是1的前提下,类似木桶原理,右下角位置的最长边长,取决于另外三个位置的最小距离,然后+1。给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。

2023-10-07 18:17:22 390

原创 leetcode动态规划之买卖股票+打家劫舍

刷题的时候发现这两种可以单独放出来总结下。

2023-10-01 20:12:03 162

原创 leetcode系列贪心算法汇总

解析:这道题的解法很是巧妙,先要根据身高维度降序排,身高相等时根据k增序排,此时得到了一个中间态的结果,在此基础上进行遍历,根据每一个的k要在的相对位置进行不断的插入操作,巧妙的点就在于这种操作并不会影响之前已经排过的位置,因为身高是降序的,k是增序的。从左往右更新max的时候,会先被更新成6,遇到4的时候发现逆序了,把4更新成右边界,继续遇到8了更新成max,遇到10了更新成max,遇到9了,逆序,记录9为右边界,之后max更新成15。所以无序的区间就是从6到9的部分。

2023-09-26 08:21:27 238

原创 leetcode406 根据身高重建队列

编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]

2023-09-25 18:53:06 121

原创 leetcode621 任务调度器

任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。因为要求两个相同的任务之间要有时间为n的空窗,所以我们要先找到次数最多的任务,然后将其余的任务都放在空窗期,这样就比较省时间,要是都分配完了,就是图中的「冷却」。然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。在本示例中,两个相同类型任务之间必须间隔长度为 n = 2 的冷却时间,而执行一个任务只需要一个单位时间,所以中间出现了(待命)状态。

2023-09-25 15:44:23 140

原创 leetcode581 最短无序连续子数组

上面这个方法当然不是最好的解法,但各种题解说的云里雾里的,看了好长时间,还是再整理下好的解法。从左往右的话,应该是递增对吧,那么先设定的叫tmpMax的最大值,符合递增就不断更新最大值,直到不满足递增了,说明这个数字不对,需要重新排序,先记录下下标;这道题目的意思就是,将一个数组分为3部分,最前面的部分是升序的,最后面的部分是降序的,中间可能乱序,把中间的排一下,使得整体有序就可以了。给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

2023-09-25 08:57:48 70

原创 相向双指针 leetcode11 盛水最多的容器

主要还是得理解了题意才行,要求的是最大容器,其实也就是最大的面积,那求面积的话,其实就是宽乘以高,宽就是双指针下标之间的距离;高就是双指针中高度较小的那个,理解了这个后,这道题目就不难了。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。这里可以注意下,如果用的是go 1.21后面的版本,就不需要自己定义max和min了,只用用就行。输入:[1,8,6,2,5,4,8,3,7]

2023-09-22 16:12:37 228

原创 leetcode543 二叉树的直径

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度。这道题竟然标的是简单。也没那么简单吧,官方题解的那个视频将的比较好,想不明白了可以去看下视频。而每个节点的对应的直径是:左子树的深度 + 右子树的深度,所以节点1的直径就是3。要去求最大的啥啥啥,首先就得考虑设置一个变量来存最大值,这个是经常用到的思路。4的深度是1,5的深度是1,2的深度是2,3的深度是1,1的深度是最大值2。解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。给你一棵二叉树的根节点,返回该树的 直径。

2023-09-22 09:02:14 97

原创 leetcode297 二叉树的序列化与反序列化

这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。本题使用的方法为深度优先搜索dfs,然后使用前序遍历,序列化的使用将空节点用null存到字符串中,然后逗号分割拼成一个字符串;输入:root = [1,2,3,null,null,4,5]

2023-09-21 18:22:01 138

原创 leetcode114 二叉树展开为链表

这道题的题目中已经描述比较清晰了,告诉了和前序遍历相同,那么就意味先来一遍前序遍历,将遍历后的结果存起来,这里需要注意一下,之前是存到了一个[]int{}结构里,因为之前返回的是一个int数组,而这次要返回链表,所以要提前定义一个[]*TreeNode{}的结构,前序遍历完得到这个结构后,再来一个循环遍历这个数组,同时遍历这个数组的两个节点,将每个节点的left置为nil,right指向下一个节点就可以了。输出:[1,null,2,null,3,null,4,null,5,null,6]

2023-09-21 17:11:51 318

原创 leetcode237 删除链表中的节点

在给定节点 node的情况下,可以通过修改 node的 next 指针的指向,删除node 的下一个节点。但是题目要求删除node,为了达到删除node 的效果,只要在删除节点之前,将node 的节点值修改为node.next 的节点值即可。解释:指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9。给你一个需要删除的节点 node。有一个单链表的 head,我们想删除它其中的一个节点 node。输入:head = [4,5,1,9], node = 5。

2023-09-20 20:31:34 166

原创 leetcode92 反转链表II

这道题不太简单,分为两种方法,先说不好理解的那种方法,主要是官方题解中的第二种方法(一次遍历穿针引线头插法),注意这种反转和之前遇到过的都不一样,写的时候很容易出错(在画图的前提下,易错点都在下面代码里了)第二种方法是在之前反转链表的基础上改进,稍微好理解一点,直接调用之前的反转链表的方法(当然这个方法也可以改成不需要返回值)输入:head = [1,2,3,4,5], left = 2, right = 4。输出:[1,4,3,2,5]

2023-09-20 15:49:22 169

原创 leetcode86 分割链表

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。首先看这道题的时候,那个示例半天没看明白,它要的是比较之后还是相对序列,并不是整体都排序了。然后直接开两个链表来做就可以。输入:head = [1,4,3,2,5,2], x = 3。你应当 保留 两个分区中每个节点的初始相对位置。输出:[1,2,2,4,3,5]

2023-09-20 08:15:35 231

原创 leetcode61 旋转链表

这道题属实不好想:需要计算出链表的长度,然后在k > n的时候,需要k%n才知道右移几位;然后用n减去上面的那个取模后的值,表示从尾节点开始,还需要走几步;然后走上面的偏移量,就达到了新链表开始的前一个节点。将这个节点的next赋值成nil后,相当于断开了后面的环,此时拿到了预期结果。给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。输入:head = [1,2,3,4,5], k = 2。输出:[4,5,1,2,3]

2023-09-19 23:00:18 328

原创 leetcode83 删除排序链表中的重复元素

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次。返回 已排序的链表。这道题和因为只删一个,直接用cur来比较就行,不需要next.next了。输入:head = [1,1,2,3,3]输出:[1,2,3]

2023-09-19 22:24:51 33

原创 leetcode82 删除排序链表中的重复元素II

这道题要将重复的元素都删除了,这就意味着头节点也可能会被删掉,因此就需要dummy,同时来进行判断的是.next和 .next.next。给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字。返回 已排序的链表。输入:head = [1,2,3,3,4,4,5]输出:[1,2,5]

2023-09-19 21:55:30 51

原创 leetcode25 K个一组反转链表

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。大致的思路是遍历到符合的位置后,调用反转链表改进后的代码,然后在递归处理后面的部分。给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。输入:head = [1,2,3,4,5], k = 2。输出:[2,1,4,3,5]

2023-09-19 19:27:33 195

原创 leetcode234 回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true;否则,返回 false。先快慢指针找到中间节点,然后反转后半个链表,再同时比较两个链表。输入:head = [1,2,2,1]

2023-09-19 16:54:20 93

原创 leetcode23 合并K个有序列表

根据二维数组的长度,从中间开始分成两部分,不断递归,然后分别调用两两合并的那个函数。输入:lists = [[1,4,5],[1,3,4],[2,6]]请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。输出:[1,1,2,3,4,4,5,6]将它们合并到一个有序链表中得到。

2023-09-19 15:35:36 177

原创 leetcode2 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。这道题是模拟法,新起一个链表来存,不断循环、相加、进位来计算,最后若还有进位就再补一位。输入:l1 = [2,4,3], l2 = [5,6,4]请你将两个数相加,并以相同形式返回一个表示和的链表。解释:342 + 465 = 807.输出:[7,0,8]

2023-09-19 15:21:49 156

原创 leetcode148 排序链表

在实际应用中,大概率会先转成数组排序后,再转成链表。对于本题而言,需要递归找到链表的中间节点后,调用之前的合并两个链表的方法。给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表。输入:head = [4,2,1,3]输出:[1,2,3,4]

2023-09-19 15:04:46 49

原创 leetcode876 链表的中间节点

解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。给你单链表的头结点 head ,请你找出并返回链表的中间结点。输入:head = [1,2,3,4,5,6]快慢指针,直接上代码,调试不清楚就画个图捋捋。如果有两个中间结点,则返回第二个中间结点。输入:head = [1,2,3,4,5]解释:链表只有一个中间结点,值为 3。输出:[3,4,5]输出:[4,5,6]

2023-09-19 14:13:02 253

原创 链表的奇偶重排 - 牛客

首先这道题定义odd指针(奇数的)指向第一个节点(head),even指针指向第二个节点,然后链表重排嘛,另odd指向even的下一个节点…给定单链表,要求将下标为奇数的节点连接在一起,偶数的节点连接在一起,然后两个再连起来。开两个新链表然后再合起来的做法肯定不是太好的办法。链表的问题还是需要动手画一张图。输入:{1,2,3,4,5,6}输出:{1,3,5,2,4,6}

2023-08-29 08:22:44 78

原创 leetcode560 和为k的子数组

需要再加上哈希表来存一下重复的数据。首先讲一下前缀和的概念,是指通过前缀和数组来保存前n位的和,如presum[1]代表的是nums数组中前1位的和,即。首先要是没思路的话,就用暴力法试试,虽然是一个一维数组,但暴力法还是要循环两次来进行处理,找到符合预期的数据。给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数。输入:nums = [1,1,1], k = 2。

2023-07-05 23:36:42 108

原创 leetcode66 加一

主要的思路是数组从后向前遍历,要判断遍历的过程中,从哪一位开始不等于9,这样的话这一位就+1,同时再遍历从这一位开始,到最后的每一位都赋值为0,最后返回即可。加入没有走到返回的代码,那么就可能是所以位都是9,对于golang来说需要再新开一个数组,大小为之前的n+1,然后第一位是1,后面的都是0即可。给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。输入:digits = [1,2,3]输出:[1,2,4]

2023-07-03 23:18:13 113

原创 leetcode1027 最长等差数列

并且如果 seq[i+1] - seq[i]( 0

2023-07-03 23:11:53 119

原创 golang的并发读写问题

答案:有问题,可能会导致竞态条件和不确定的行为,这是因为每个字符串是不可变的,每次对字符串的修改实际上都会创建一个新的字符串,如果多个goroutinue同时修改同一个字符串,可能会导致不同的goroutine使用不同的版本,从而会引发错误或产生不一致的结果。答案:因为map变量为指针类型,并发写时,多个协程同时操作一个内存,类似于多线程操作同一个资源会发生竞争关系,共享资源会遭到破坏,因此golang出于安全的考虑,抛出错误;答案:没问题,字符串是不可变的,在并发读的时候是安全的。

2023-07-03 21:33:26 258

原创 leetcode 5 最长回文子串

如果是dp[i][j]为true,否则为false。(是一个true还是false的定义,由于题目是求最长回文串,所以这个dp肯定不能用来当最后的结果)二维布尔型dp数组的话,默认初始化是false,但要注意其实dp[i][i]这种的一定是true,可以在初始化的时候赋值好。这道题的定义方法之前遇到过:表示区间范围[i,j] (注意是左闭右闭)的子串。= s[j] 时,那什么都不用说了,肯定是false;如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。解释:“aba” 同样是符合题意的答案。

2023-06-18 22:19:35 708 1

设计模式总结.pdf

自己整理的关于设计模式的总结,有全部的设计模式介绍,以及常用的设计模式总结记忆,适合程序员面试前突击以及日常学习使用

2020-07-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除