自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 算法通关村第一关——找环入口

使用快慢指针的方法来检测链表中是否存在环,并找出环的起始节点。时间复杂度:O(n)O(n)O(n)空间复杂度:O(1)O(1)O(1)

2023-11-30 11:38:56 266

原创 算法通关村第一关——链表经典问题之删除链表元素笔记

总结一下高频常用的删除链表结点的情况,无论对链表进行何种操作,都需要和。,将头结点的特殊性转化为一般,在后面具体阐述。

2023-11-29 22:51:39 352

原创 算法通关村第一关——链表青铜挑战笔记

关键:找到末尾节点后将新节点赋值给末尾节点的next就ok。关键: 找到末尾的前一个节点,和删除中间节点一样的操作。关键: 找到要删除的前一个节点,然后。

2023-11-27 16:13:59 504

原创 力扣打卡 1457-二叉树中的伪回文路径

首先想用最暴力的深度优先DFS,使用方法来遍历二叉树并存储所有路径。该方法接收当前节点、当前路径和路径列表作为参数。当到达叶子节点时,将当前路径添加到路径列表中。然后,我们遍历每条路径,并调用方法来判断路径是否为伪回文。更新结果并输出。这样能跑二叉树体量较小的用例,代码中使用了一个路径列表来存储所有的路径,这也会占用大量的内存空间,特别是当二叉树非常大时,路径数量可能非常庞大,导致内存消耗过大。因为节点的值只可能为1到9,因此可以用一个长度为10的数组来记录路径中各个值出现的次数。并且用深度优先搜索的方式

2023-11-25 11:00:01 532

原创 力扣打卡 1410-HTML实体解析器

当处理 HTML 实体解析时,先构建一个映射,将特殊字符实体与它们的替换字符对应起来。接下来,使用迭代的方法遍历输入的文本字符串。当遇到字符时,开始检查可能的字符实体。如果找到了一个字符实体,并且它在映射中有对应的替换字符,将该字符实体替换为对应的字符,然后继续遍历。时间复杂度:O(n)O(n)O(n),其中 nnn 是输入字符串的长度。算法遍历一次输入字符串。空间复杂度:O(1)O(1)O(1),除了存储字符实体映射的额外空间外,算法不需要额外的空间。

2023-11-23 13:32:32 383

原创 力扣打卡 2304-网格中的最小路径代价

该问题可以使用动态规划的思想进行求解。我们可以从网格的起点开始,逐行计算每个单元格的最小路径代价,最终得到从起点到终点的最小路径代价。时间复杂度:O(mn2)O(mn^2)O(mn2)行遍历进行m-1次,更新当前行的最小路径成本需要两层列遍历。空间复杂度:O(n)O(n)O(n)初始化了最小成本数组,长度为n

2023-11-22 11:59:35 254

原创 力扣打卡 2216-美化数组的最少删除数

一次遍历,模拟一次遍历数组,模拟删除过程。每次判断当前数字与下一个数字是否相等,并且当前位置与删除数字数目的差是否为偶数。如果满足条件,则将删除数字数目加一。最后,如果数组长度与删除数字数目的差为奇数,则再删除一个数字。返回最终的删除数字数目。时间复杂度:O(n)O(n)O(n)空间复杂度:O(1)O(1)O(1)

2023-11-21 11:39:53 223

原创 力扣打卡 2342-数位和相等数对的最大和

首先暴力解法在数据量不大的情况下是一定可行的,两层for循环遍历每一种匹配可能,自己写一个计算数位和的工具函数。但是时间复杂度来到了O(n2)O(n^2)O(n2),题目用例的数据到10^5的级别就会超时。维护一个哈希表,建立 元素的数位和=>元素的映射,遍历数组中的元素,每遍历到一个求它的数位和,并且判断在哈希表中有没有已经存在的key值等于它的数位和的,如果有,更新保留最大结果并且存入更大的元素在同一个key上。遍历完成后结果一定是最大的。创建一个对象,用于存储数位和和对应的最大值。遍历输入数组中的每个

2023-11-20 22:31:31 285

原创 力扣打卡 560-和为K的子数组

首先想到的就是暴力枚举,每个元素都可能能成为子串的头部。优化:前缀和+哈希表在遍历数组的过程中,我们计算当前的前缀和 ,然后检查是否存在一个之前的前缀和 ,如果存在,说明从该前缀和到当前位置的子数组和为 k,所以我们将其出现次数加到结果 res 中。然后,我们更新哈希表 ,将当前前缀和 的出现次数加1。最后,返回结果 。时间复杂度:O(n2)O(n^2)O(n2)空间复杂度:O(1)O(1)O(1)时间复杂度:O(n)O(n)O(n)空间复杂度:O(n)O(n)O(n)

2023-11-17 12:08:19 560

原创 力扣打卡 2760-最长奇偶子数组

这道题要求找到最长的奇偶子数组的长度,其中奇偶性由给定的阈值进行判断。我们可以使用滑动窗口的方法来解决这个问题。我们用两个指针 left 和 right 来表示滑动窗口的左右边界,初始时都指向数组的第一个元素。然后,我们不断移动右指针 right,直到不满足以下所有过滤条件:(找到了字串起点)当遇到满足上述条件之一时,我们将右指针 right 向右移动一位,并继续判断下一个元素。如果当前元素满足以下条件,则更新最长子数组的长度:时间复杂度:O(n)O(n)O(n)其中 n 是数组的长度。我们最多遍历一

2023-11-16 14:23:22 516

原创 力扣打卡 128-最长连续序列

这道题最直接的想法就是排序,排序之后连续的序列就很容易找到了。不过排序的时间复杂度是,而题目要求我们时间复杂度为 ,这就得另想办法了。想找连续序列,首先要找到这个连续序列的开头元素,然后递增,看看之后有多少个元素还在 中,即可得到最长连续序列的长度了。我们可以用空间换时间的思路,把数组元素放到哈希集合里面,然后去寻找连续序列的第一个元素,即可在 时间找到答案。时间复杂度:O(n)O(n)O(n)其中 n 是数组 nums 的长度。遍历数组和哈希集合的操作都是线性时间复杂度的。空间复杂度:O(n)O

2023-11-15 13:15:24 600

原创 力扣打卡 1334-阈值距离内邻居最少的城市

这道题要求找到在给定的阈值距离内,具有最少邻居城市数量的城市。我们可以使用Floyd算法来解决这个问题。时间复杂度:O(n3)O(n^3)O(n3)n是城市的数量,Floyd算法有三层遍历空间复杂度:O(n2)O(n^2)O(n2)需要用二维数组mp来存储城市之间的距离

2023-11-14 14:37:56 215 1

原创 力扣打卡 121-买卖股票的最佳时机(贪心、动态规划)

一道经典的贪心例题。

2023-11-13 15:03:14 263

原创 力扣打卡 765-情侣牵手(并查集)

模拟一次四对情侣的换位这次换位的位置指向具有首尾相连的特点,也就是说四对情侣(或者说座位)在一个连通分量内,每一次换位都能促成一对情侣成功牵手,因此需要交换3次(3对情侣都找到了配偶那剩下的一定找到了配偶)。要求输出最少交换次数,假设有N对情侣,逻辑上能相连(也就是在一个连通分量里)的情侣为:N1,N2,…,Nn,(n就是换位前的连通分量数)并且N1 + N2 +…+ Nn = N。由上面的例子可以知道,找到正确的配偶后,座位其实就成为了一个独立的连通分量,这种独立的连通分量就是我们所希望得到的。找位

2023-11-11 17:58:12 988 1

原创 力扣打卡 2300-咒语和药水的成功对数

数据量不大的话直接暴力模拟也是可行的,但是该题的药水量和咒语量可以达到10^5级别,因此用暴力模拟不能通过所有用例。暴力模拟就没啥好说的,两层嵌套循环,但是时间复杂度到了O(n*m),用例中n和m都能达到10^5级别。二分查找:时间复杂度:O(nlogm)O(nlogm)O(nlogm)其中n是spells数组的长度,m是potions数组的长度。算法中有一个外层循环,循环次数是n,而内部使用了二分查找,其时间复杂度为O(log m)空间复杂度:O(n)O(n)O(n)创建了一个结果数组res,长

2023-11-10 12:01:21 230 1

原创 力扣打卡 11-盛最多水的容器

这题长得就像一个窗口,就是求窗玻璃的面积滑动窗口:从两边向中间收缩,每次都记录中间“矩形”的最大值注意收缩技巧:和哪边短收缩哪边时间复杂度:O(n)O(n)O(n) 只需遍历窗口空间复杂度:O(1)O(1)O(1) 没有新开数据结构,只有一些常量

2023-11-09 10:56:09 112 1

原创 力扣打卡 2609-最长平衡子字符串

平衡字符串的长度一定为偶数,因此想到维护一个标记数组,长度为2,顾名思义就是存放0和1的出现次数。遇到1则自增1,遇到0则自增1。注意判断0是否是平衡字符串的开头,要重置标记数组。在每次遇到1的时候更新结果,拿标记1和标记2长度取小值然后乘以2就能得到平衡字符串的长度。遍历整个字符串,按照以下规则更新标记数组:当遍历到1时:自增1,更新答案当遍历到0时,首先判断这个0的情况:2.1 该0是整个字符串最开始的0,或者该0是上一个平衡字符串结束后出现的第一个0做法:置为1,置为0,表明新的平衡字符串的开

2023-11-08 11:36:04 365 1

原创 力扣打卡 2586-统计范围内的元音字符串数

题目面板较为容易,直接暴力模拟是可行的。另外可以用哈希集合存放元音字母,拿遍历的首尾字母去哈希集合中找是否有重复的,同样可以判断。时间复杂度:O(n)O(n)O(n) 取决于的值空间复杂度:O(1)O(1)O(1) 元音字母表长度固定

2023-11-07 16:18:24 161 1

原创 力扣打卡 318-最大单词长度乘积

单词都是小写字母,想到暴力遍历每一种对比组合,大概是次的对比,关键在于如何确定两个单词有无公共字母。把他们变成charList再for循环比较?听着就累,因而想到用位运算来记录每个单词的特征,判断时将两单词的二进制位掩码相与就可以知道有无重复字母。时间复杂度:O(L+n2)O(L+n^2)O(L+n2) L是单词列表中单词长度之和,预处理每个单词的位掩码需要遍历所有单词的所有字母,n^2是两层循环遍历掩码数组所花时间空间复杂度:O(n)O(n)O(n) n是数组words的长度,需要创建长度为n的

2023-11-06 10:59:54 125 1

原创 力扣打卡 187-重复的DNA序列

由于DNA片段定长为10,因此想到哈希建立 DNA片段->出现次数 的映射,一旦出现次数大于1,则往答案List中存入这个片段时间复杂度:O(NL)O(NL)O(NL) L为DNA片段的长度10空间复杂度:O(NL)O(NL)O(NL) L为DNA片段的长度10

2023-11-05 23:01:58 120 1

原创 力扣打卡 2103-环和杆

杆和环是一对一或一对多的关系,很自然地想到用Map来建立杆号->环集合的映射,将字符串内容按需存到Map中,读Map时一旦发现有某个杆号对应的环集合包含三种颜色,就将结果+1时间复杂度:O(M+N)O(M+N)O(M+N)空间复杂度:O(M+N/M)O(M + N/M)O(M+N/M)

2023-11-02 15:41:49 254 1

原创 力扣打卡 102-二叉树的层序遍历

while控制纵向遍历,for控制横向遍历。广度优先搜索BFS创建一个空列表 ,用于存储每一层的节点值。检查根节点是否为空,如果为空,直接返回空的 列表。创建一个队列 ,并将根节点 添加到队列中,表示从根节点开始进行层次遍历。进入主循环 while (!q.isEmpty()),这个循环将用于控制从上向下的层次遍历。在每次循环开始时,首先获取队列中的节点个数,即 ,这个值表示当前层的节点数量。创建一个空列表 ,用于存储当前层的节点值。使用一个 for 循环遍历当前层的节点,遍历范围是。在循环中,首先从队

2023-10-31 11:41:09 124 1

原创 力扣打卡 275-H指数 ||

数组按照升序排序,答案集中在数组中间部分,想到二分查找。整数数组 citations,表示了研究论文的引用次数。使用二分查找的方法来找到合适的H指数。二分查找的初始范围是 和 ,分别初始化为数组的第一个元素和最后一个元素的索引。在循环中,代码计算中间元素的索引 ,并获取中间元素 的引用次数。接下来,代码检查 是否大于等于 。这是因为H指数的定义是:至少有 篇论文被引用了至少 次。如果 citations[mid] 大于等于 ,则说明H指数需要减小,因此将 right 范围缩小到 。如果 citat

2023-10-30 11:01:34 133

原创 力扣打卡 73-矩阵置0

为0,则i行和j列都要为0,很自然的想到要记录0元素的行号和列号。维护两个布尔类型的数组:和搜寻0元素,将其其行号和列号分别存入重新遍历一次数组,当:时,将置0时间复杂度:O(mn)O(mn)O(mn)空间复杂度:O(m+n)O(m+n)O(m+n)解题方法2用原数组的第一行和第一列代替解法1申请的两个记录数组。但是这样会让原数组的第一行和第一列完全和之前无关,因此设定两个标记变量来表示原来的第一行和第一列是否有0。首先预处理两个标记变量,然后用其它行列去处理第一行和第一列(即投影并按需要置零

2023-10-29 11:44:35 157 1

原创 力扣打卡 240-搜索二维矩阵 ||

矩阵给出,目标给出,暴力枚举一定能找到,但是题目要求使用更高效的方法。可以发现矩阵的特点,从左往右,从上到下都是递增的。容易想到:当前位置比target小,要前往下方或右方搜寻,当前位置比target要大,要前往左方或上方搜寻。因此最后一步就在于选择遍历起点:老老实实从左上角开始遍历?显然不行,因为从左上角开始,移动的方向只有向右或者向下,这些都是往一个增的方向去的。选择哪一个方向是无法判断的,硬要这样走只能接入类似动态规划的穷举,更新最优状态,没有必要。因此,选择右上或左下开始遍历是最好的,能移

2023-10-29 10:50:55 134 1

原创 力扣打卡 48-旋转图像

找图形旋转方法先沿着“\”对角线旋转一百八十度,再反转数组的每一行时间复杂度:O(n方)O(n方)O(n方)空间复杂度:O(1)O(1)O(1)

2023-10-28 13:44:59 153 1

原创 力扣打卡 54-螺旋矩阵

螺旋遍历涉及到转向,按照右、下、左、上的顺序遍历,因此想到抽象出四个边界来圈定未遍历元素的范围。向右遍历完成后upper_bound++,向下遍历完后right_bound–,向左遍历完后lower_bound–,向上遍历完后left_bound++;逐过程翻译即可时间复杂度:O(m∗n)O(m * n)O(m∗n)空间复杂度:O(1)O(1)O(1)

2023-10-28 13:15:38 225 1

原创 力扣打卡 206-反转链表

递归。

2023-10-27 11:38:07 156 1

原创 力扣打卡 160-相交链表

链表双指针。

2023-10-27 10:58:08 299 1

原创 力扣打卡 -53-最大子数组

首先想到用滑动窗口,但是数组中存在负数,如何确定何时收缩和扩张窗口呢?

2023-10-26 12:00:26 110

原创 力扣打卡 3-无重复字符的最长字串

右窗口扩张不断存入字符c,当window[c]的值大于1时,就应该收缩左窗口。一直保持window[c]的值为1,即满足了找到“无重复字符的字串”,注意每次每次窗口收缩完成后都进行一次结果的max处理。维护一个哈希表window作为计数器,建立char->int(出现次数)的映射。,因为窗口收缩后一定保证窗口中没有重复元素,保证最后返回的结果是“最长的”

2023-10-25 11:33:18 111 2

空空如也

空空如也

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

TA关注的人

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