
刷题与算法
文章平均质量分 65
我的LeetCode刷题与算法
深夜无眠T
记录我的学习之旅
展开
-
LeetCode-二叉树展开为链表
给你二叉树的根结点rootTreeNoderightnullroot = [][]root = [0][0]原创 2025-02-09 21:03:45 · 391 阅读 · 0 评论 -
LeetCode-环形链表
每日一题。原创 2025-02-08 18:06:45 · 430 阅读 · 0 评论 -
LeetCode-盛最多水的容器
给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i, 0)和。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。49图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。1。原创 2025-02-07 21:03:11 · 438 阅读 · 0 评论 -
LeetCode-全排序
给定一个可包含重复数字的序列nums返回所有不重复的全排列。原创 2025-02-06 15:14:30 · 320 阅读 · 0 评论 -
LeetCode-轮转数组
首先我们可以借助另外一个数组储存移动过后的数组,最后再复制到原数组之中,这种思路很好理解,不过需要借助另外的数组,在时间和空间上的速度就略显不足了。再把前k个和后几个再次反转,这样既移动了位置又把顺序恢复了回来,很巧妙。另外一种思路是通过三次翻转的方式,在原数组中即可完成移动。本题的含义很清晰,本质就是要在原位置移动数组,这里可以有两种思路。向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100],将数组中的元素向右轮转。原创 2024-08-21 11:08:46 · 422 阅读 · 0 评论 -
LeetCode-得到更多分数的最少关卡(前缀和)
可获取的分数是一定的,把0替换成-1并且求出sum,遍历并记录alice已经获得的分数,sum - pre 为bob可以获得的分数。请你返回 Alice 获得比 Bob 更多的分数所需要完成的。需要完成多少个关卡,才能获得比 Bob 更多的分数。完成一些关卡,然后 Bob 会完成剩下的所有关卡。一个玩家通过一个简单模式的关卡可以获得。Alice 需要完成至少一个关卡获得更多的分数。Alice 需要完成至少三个关卡获得更多的分数。个关卡的游戏,游戏中有一些关卡是。游戏的一开始,Alice 将从第。原创 2024-08-05 16:00:00 · 310 阅读 · 0 评论 -
LeetCode—修改后的最大二进制字符串(贪心)
00可以变10,可以消耗0将高位都变为1,比如000->110。最后只剩下一个0,不用动,此时就是最大的值。可能会有人觉得用10换01不是变小了么,但是要想,当0的个数大于1个的时候,将0推到前面之后就可以将00替换10,相当于用高位的1换了低位的1,一定是变大的。所以我们只要记录第一个0开始的位置idx,并计算0的个数m,那么最后一个0就是放在idx + m - 1的位置上,其余位填充1即可。最后可以用char数组合并成str,我这里直接用builder拼接也能过,别用String直接+就行,会超时。原创 2024-08-05 10:22:51 · 486 阅读 · 0 评论 -
LeetCode-找到字符串中所有字母异位词(滑动窗口)
本题可以使用滑动窗口来求解,先使用两个数组来维护窗口内每个词出现的频率,一个数组记录要求解的字符串中单词的频率,一个维护当前窗口内单词的频率,通过不断地移动窗口时将两个数组进行对比,如果相同则证明此时是异位词,记录下当前索引。起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。原创 2024-08-16 13:52:14 · 271 阅读 · 0 评论 -
LeetCode-字母异位词分组
本题的意思很简单,就是把字母组成相同的字符放在一个数组里面,为此,我们可以遍历数组,将每个字符串先变为一个char数组,然后对其进行排序,因为一个字符串如果组成相同,那么在排序后肯定是相同的。因此我们用一个map来储存每种字母组合,将排序后的字符串作为key,将原本的字符串作为value,依次放入其中。是由重新排列源单词的所有字母得到的一个新单词。可以按任意顺序返回结果列表。给你一个字符串数组,请你将。原创 2024-08-14 16:19:23 · 387 阅读 · 0 评论 -
LeetCode-重新放置石头
第 i = 0 步操作中,我们将位置 1 处的石块移到位置 2 处,有石块的位置为 [2,2,3,3]。第 i = 1 步操作中,我们将位置 3 处的石块移到位置 2 处,有石块的位置为 [2,2,2,2]。第 i = 0 步操作中,我们将位置 1 处的石块移到位置 2 处,位置 2,6,7,8 有石块。第 i = 1 步操作中,我们将位置 7 处的石块移到位置 9 处,位置 2,6,8,9 有石块。第 i = 2 步操作中,我们将位置 2 处的石块移到位置 5 处,位置 5,6,8,9 有石块。原创 2024-08-05 15:30:00 · 319 阅读 · 0 评论 -
算法—滚动数组思想
滚动数组思想是一种优化空间复杂度的技巧,在面对一些动态规划问题时,我们会定义一个二维数组来保存中间状态,以便计算最终的解。然而,有时候我们可以通过滚动数组的方式,减少空间复杂度,而不影响计算的正确性。滚动数组实际上是一种“压缩”状态空间的方法。它的核心思想是,对于某些动态规划问题,当前状态只依赖于之前的若干个状态,而不需要所有之前的状态都保留。因此,我们可以只用几个变量(数组元素)来保存这些必要的中间状态,而不用整个二维数组。简而言之就是不用记录下所有的中间状态,因为当前状态会有规律地继承于之前的状态。原创 2024-07-30 09:27:34 · 1138 阅读 · 0 评论 -
LeetCode-丑数
每日一题,今天刷到一道感觉比较有意思的题,刚开始按自己的思路解答时发现超时了,看到官方的题解后恍然大悟!!!原创 2024-07-26 15:11:05 · 370 阅读 · 0 评论 -
LeetCode——被管绕的区域
在搜索时可以使用深度优先搜索,从边界搜索到图中所有的符号,最后根据标记所得将所有的标记为false的变为”X“,这样我们就成功替换了所有被包围的”O“。因此我们就可以从整个图的边界开始查找,找到所有与边界”O“相连的”X“,除了这些”O“,把剩下的全部”O“都变成”X“。题目中的意思就是指将数组中被”X“包围”O“全部变成”X“,而只有和边界”O“相连的”O“才不会被”X“包围。在上图中,底部的区域没有被捕获,因为它在 board 的边缘并且不能被围绕。原创 2024-07-19 15:21:32 · 401 阅读 · 0 评论 -
LeetCode-最大平均值和的分组
这道题是很明显是要使用动态规划,因此我们使用二维数组dp[i][j]来表示一个数在区间 [0,i−1]被切分成j个子数组的最大平均值和。nums 的最优分组是[9], [1, 2, 3], [9]. 得到的分数是 9 + (1 + 2 + 3) / 3 + 9 = 20.我们也可以把 nums 分成[9, 1], [2], [3, 9].这样的分组得到的分数为 5 + 2 + 6 = 13, 但不是最大值.数组中的每一个数进行分组,并且分数不一定需要是整数。今天做的是一道动态规划的问题,还需要用到前缀和。原创 2024-04-09 20:18:52 · 257 阅读 · 0 评论 -
LRU的原理与实现(java)
LRU的英文全称为Least Recently Used,即最近最少使用。它是一种内存数据淘汰算法,当添加想要添加数据而内存不足时,它会优先将最近一段时间内使用最少的数据淘汰掉,再将数据添加进来。原创 2024-04-06 22:59:12 · 699 阅读 · 0 评论 -
LeetCode-统计完全连通分量的数量
给你一个整数n。现有一个包含n个顶点的图,顶点按从0到n - 1编号。给你一个二维整数数组edges其中表示顶点ai和bi之间存在一条边。返回图中的数量。如果在子图中任意两个顶点之间都存在路径,并且子图中没有任何一个顶点与子图外部的顶点共享边,则称其为。如果连通分量中每对节点之间都存在一条边,则称其为。3如上图所示,可以看到此图所有分量都是完全连通分量。原创 2024-04-01 19:55:52 · 1131 阅读 · 0 评论 -
LeetCode547——省份数量(并查集)
假如在前面的合并动作中,先将第一个节点和第二个节点合并了,然后想再合并第三个节点,也就是parent[0]=0,parent[1]=0,parent[2]=1,那么在寻找下标为2也就是第三个节点时就会通过递归将parent[2]的值设为parent[1]的值,也就是0,这样就找到了第三个节点的根节点。parent[0]=0,parent[1]=0,就代表第一个节点的根节点为它本身,第二个节点的根节点的是第一个节点,即代表两个节点相连了。该题的关键在于理解理解find方法,理解是如何找到根节点并进行合并的。原创 2024-03-27 23:37:39 · 610 阅读 · 0 评论 -
单调栈(LeetCode-下一个更大元素)
什么是单调栈?单调栈的定义其实很简单,所谓单调栈就是指一个单调递增或是单调递减的栈。那单调栈有什么用呢?单调栈通常用来在一串数字(例如数组)中,找到某个数字的左侧或是右侧最近的大于或小于这个数字的数。那么是如何实现的呢?如果想要在一个数组中找到一个数字右侧大于它本身的第一个数,就可以使用一个单调递增的栈来实现。原创 2024-04-07 00:31:08 · 1301 阅读 · 0 评论 -
LeetCode-零钱兑换II
每日一题,今天刷到的是零钱兑换,总体思路是使用动态规划。原创 2024-04-06 00:12:50 · 800 阅读 · 0 评论 -
LeetCode——蜡烛间的盘子(前缀和+预处理)
每日一题,今天抽到的题目是蜡烛间的盘子,题目要求如下:给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从开始的字符串s,它只包含字符'*'和'|',其中'*'表示一个'|'表示一支。同时给你一个下标从开始的二维整数数组queries,其中表示对于每个查询,你需要找到在的盘子的。如果一个盘子在左边和右边至少有一支蜡烛,那么这个盘子满足在。[3, 8]"*|| ** |"2请你返回一个整数数组answer,其中answer[i]是第i个查询的答案。[2,3]原创 2024-04-03 19:30:07 · 711 阅读 · 0 评论 -
LeetCode-2202 K次操作后最大的顶端元素(JAVA)
而当k小于栈的大小时,我们可以得到k-1前的所有元素,和第k+1个元素(即所有的操作都在弹出元素。这道题让我们操作一个栈,我们可以将元素弹出或是将弹出的元素的再次压入栈,每次弹出或压入算一个操作,求解出经过k次操作后可以得到的最大元素。我们经过k次操作后有几种情况,当k的值大于栈的大小时我们可以得到栈中所有的元素,因此直接遍历栈就可以得到最大值。还有一种特殊情况,当栈中只有一个元素,且操纵数为奇数时,我们无论怎么操纵都会将唯一的元素弹出,因此此时返回-1.次操作以后,栈一定为空,请你返回。原创 2024-03-31 23:59:24 · 372 阅读 · 0 评论 -
LeetCode-使数组为空的最小操作数
每日一题。今天刷的是一道有关于数学的题。原创 2024-04-19 20:36:09 · 520 阅读 · 0 评论 -
LeetCode-最大子数组和
每日一题今天刷到的是一道利用动态规划解决的题目。原创 2024-04-18 23:36:18 · 364 阅读 · 0 评论 -
二叉树的创建和遍历(java)
二叉树是一种常见的树形数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。这些节点以层次结构的方式组织在一起,每个节点都有一个父节点,除了根节点外,每个节点都有一个唯一的父节点。二叉树常用于实现搜索、排序和数据组织等算法。原创 2024-04-16 10:46:10 · 1016 阅读 · 0 评论 -
LeetCode-去除重复字母(单调栈)
每日一题今天刷到一个有意思的题是去除重复字母,这是一道中等难度的题,当刚读到题目时,我还在诧异一个去重为什么是中等难度?当正式读完提后就明白了,这道题不仅要求去重,还要求将这样就有点麻烦了那么像这种和左右比大小的题很大概率上都可以使用单调栈,对于这道题来说还需要一点贪心的思想。那么话不多说,我们看题。原创 2024-04-12 17:16:41 · 810 阅读 · 0 评论 -
LeetCode-最长递增子序列
每日一题今天继续来练习动态规划。原创 2024-04-20 20:02:10 · 365 阅读 · 0 评论 -
LeetCode-二叉树修剪
每日一题今天遇到的题比较简单,是一道二叉树的题。原创 2024-04-17 19:43:54 · 515 阅读 · 0 评论 -
用java实现单链表的头插,尾插和反转
定义了节点中的值,节点的下一个节点,和一些基本的方法。int val;原创 2024-04-13 23:55:27 · 300 阅读 · 0 评论 -
LeetCode-全排序(回溯算法)
每日一题今天写了一道需要用到回溯的题。原创 2024-04-13 15:55:52 · 307 阅读 · 0 评论 -
LeetCode-冗余连接(并查集)
每日一题,今天又刷到一道使用并查集来解决的问题,再次加深了一遍自己对并查集的印象和使用。原创 2024-04-10 14:06:11 · 410 阅读 · 0 评论 -
LeetCode-最大数
每日一题今天刷到是一个需要自定义排序的题。原创 2024-04-14 19:57:06 · 322 阅读 · 0 评论 -
算法——滑动窗口
滑动窗口算法是一种用于解决数组或字符串中的子数组或子串问题的有效算法。它通过使用一个双指针来维护一个滑动窗口来在线性时间内解决问题,通常用于解决一些需要在连续子序列上进行操作的问题,,比如最大值、最小值、平均值、子数组和子串的和等。原创 2024-04-16 00:10:57 · 3245 阅读 · 1 评论 -
LeetCode-旋转链表
每日一题,很久没做链表的题了,今天做l一道相对简单的力扣中等难度题。原创 2024-04-28 22:44:25 · 307 阅读 · 0 评论 -
LeetCode—和为K的子数组(前缀和)
借助官方题解中的一张图,在遍历结束后,会得到所有的前缀和及其出现的次数,在不断的遍历中pre-k会不断更新,在将其和前缀和去匹配,如果相等了count就加一。例如,求第3到5个数的和,就可以转化为前5个数的和减去前2个数的和,两个前缀和相减就可以来表示一个连续子数组的和。但是,暴力求解虽然简单,但是时间消耗是很大的,时间复杂度是n的平方。因此我们可以使用另外一种方式来求解此题,可以思考一下,题目中让求的说连续的子数组和,因此最简单的一种方法就是暴力求解,找到所有的子数组,计算和是否为K。原创 2024-07-10 11:35:32 · 266 阅读 · 0 评论 -
LeetCode-非递增子序列
每日一题今天刷的依旧是一道中等题,不过感觉今天这道题是中等难度里面比较难的题了,思考了很长时间。过程感觉比较难以理解。原创 2024-04-24 20:35:08 · 284 阅读 · 0 评论 -
LeetCode-网络延迟时间(Dijkstra算法)
每日一题今天刷到一道有关的图的题,需要求单源最短路径,因此使用Dijkstra算法。原创 2024-05-02 22:05:06 · 1355 阅读 · 0 评论 -
LeetCode-电话号码的字母组合(回溯)
每日一题今天刷到的是一道利用回溯来解决的题,不过稍微有点复杂,并且我也有一段时间没有做回溯了,所有在解题时也是思考了一段时间。原创 2024-04-21 22:32:33 · 659 阅读 · 0 评论 -
LeetCode-竖直打印单词
每日一题今天依旧是一道力扣的中等难度的题,但是个人感觉这道题算是中等难度里比较简单的一道题。在做的时候也很顺利,最后运行地也很快。原创 2024-04-22 21:31:04 · 591 阅读 · 0 评论 -
LeetCode-移除后集合的最多元素数(java)
移除后,数组变为 nums1 = [1,4,5] 和 nums2 = [2,3,2]。移除后,数组变为 nums1 = [1,2,3] 和 nums2 = [4,5,6]。对此,我们利用添加的思想,先得出两个数组中各自具有的数字,也就是不在这两个数组交集之中的数字,先将这些数字添加进集合。此时选完后如果c1+c2原创 2024-07-18 11:45:42 · 465 阅读 · 0 评论