自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 89.格雷编码

新元素的构成是在原始数组上逆序遍历,再在该元素的最高位添加一个1 ,在二进制中表述为。然后采用逆序,nums的元素左移并且后端添加1,添加到nums后端。同理可得 ,n = 3 的时候, nums = [000,010,110,100 , 101,111,011,001][0,2,3,1] 也是一个有效的格雷码序列,其二进制表示是 [00,10,11,01]。所以n = 2 的时候, nums =[00, 01, 11, 10][0,1,3,2] 的二进制表示是 [00,01,11,10]。

2024-07-02 13:26:14 447

原创 114.二叉树展开为单链表

最简单的思路就是遍历每一个结点,将右节点挂到左节点最右端的下端,然后再将左节点挂到最上端结点的右端,左节点变为null;这是从上到下的操作。从下往上走,对于每一个结点,将其左右结点压入栈中保存,再弹出依次挂到右端上;这需要保存一个pre指针来辅助。额外空间)展开这棵树吗?你可以使用原地算法(

2024-06-13 14:57:53 275

原创 98.验证二叉搜索树

就是不能判断该节点和自己的左右子结点的大小,要判断左右子树的全部结点,因此需要引入两个指针min 和 max 来维护判断。根节点的值是 5 ,但是右子节点的值是 4。,判断其是否是一个有效的二叉搜索树。给你一个二叉树的根节点。

2024-06-12 12:25:43 208

原创 二叉树构建

由于二叉树的左右子树和整树相似(即子问题和原始问题相似),因此多考虑使用递归的方法解决问题。将数组转换为二叉树就是将数组进行二分法,将中间的点作为父节点,构建左右子树。[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。·leetcode 108.将有序列表转换为二叉树。排列,请你将其转换为一棵。

2024-06-12 11:37:03 333

原创 二叉树的直径

对于一个结点,找出左边的最大深度 再找出右边的最大深度 再相加加2就是该节点的最大直径。3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。·543——lettcode——二叉树的直径。这条路径可能经过也可能不经过根节点。利用ans ,更新获取整个树的最大直径。是指树中任意两个节点之间最长路径的。给你一棵二叉树的根节点,返回该树的。

2024-06-12 10:50:23 160

原创 判断对称树

刚刚学了广义遍历,所以想是否可以创建一个队列,将每一层的结点压入队列中,再判断是否是对称。这里有个小技巧是,将需要判断是否是相等的两个结点放到一处。根据前后弹出的两个结点判断是否相等,从而判断是否是对称树。·leetcode - 101 - 对称二叉树。给你一个二叉树的根节点。, 检查它是否轴对称。

2024-06-11 15:21:56 151

原创 二叉树遍历

二叉树的遍历有先序遍历(根 --> 左 --> 右) 中序遍历(左 -- > 根 -- > 右)遍历的方法也很简单,只需要将迭代语句和打印语句交换位置即可。`leetcode - 94- 二叉树的中序遍历。后序遍历(左 -- > 右 ---> 根)给定一个二叉树的根节点。

2024-06-11 13:59:30 182

原创 二叉树最大深度

--------102.二叉树的层次遍历(广度遍历的变形)是指从根节点到最远叶子节点的最长路径上的节点数。·leetcode- 104-二叉树的最大深度。(即逐层地,从左到右访问所有节点)。迭代法最简单(遍历左数和右数,取最大)基于广度优先算法,需要用到队列。基于深度优先算法,需要用到栈。

2024-06-11 13:53:01 176

原创 二叉树左右树交换

leetcode 226题 翻转二叉树。,翻转这棵二叉树,并返回其根节点。给你一棵二叉树的根节点。

2024-06-11 13:49:02 230 1

原创 19.删除链表的倒数第N个结点

使用快慢指针,慢指针比快指针晚出发n步.如图所示,当快指针到达链表尾部的时候,slow指针刚好到达要删除的结点的前一个结点。此时的删除语句: slow.next = slow.next.next。但是上述代码存在的问题在于,当需要删除头结点的时候出现错误。因此为了删除头结点需要创建一个dummy空结点,dummy.next = head 这时候就可以删除头结点了。给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。

2024-06-07 20:25:01 209

原创 240.搜索二维矩阵

---如果想做该算法,需要搞清楚的事情是。当中间值 小于 target时候,需要查找的三个象限为左上、左下、右上;当中间值 大于 target 的时候,需要查找的三个象限为右上、左下、右下。------耗时太长了,还不如每一行使用二分查找。但是做一点点小小的优化,只有当每一行的第一个元素 小于 target , 并且 最后一个元素 大于 target 的时候,才进行二分查找。想编写一个二维二分查找的算法,就是说将二维矩阵分为四个象限,根据中间值的大小判断要搜索的区域。

2024-06-05 12:24:53 377

原创 189.轮转数组

将原始数组拆分为两个部分:前k 和 后n-k。并且将后面的元素先存在,前面的元素往后移,再将额外存储的元素添加到数组的前端。向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100],将数组中的元素向右轮转。

2024-06-03 19:57:03 216

原创 56.合并区间

—为了方便计算,最好的方法是先给数组按照第一个元素排序,如何再判断是否区间重合。区间重合的判断就是,前一个元素的第二个元素 大于或者等于 后一个元素的第一个元素, 即。从头开始往后合并区间,因为合并后的区间还需要考虑是否能和下一个区间合并。因此最好的办法是将合并后的结果,放置在后面的位置,再往后合并。区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,4] 和 [4,5] 可被视为重叠区间。

2024-06-03 19:21:06 121

原创 239.滑动窗口的最大值

结果存储,创建长度为 i - k + 1 长度的数组,当i >= k - 1 的时候就可以开始将对头下标对应的元素添加到数组中,此时数组的下标为i - k + 1。-入队的原则是, 当队列不为空并且nums[i]元素 大于 队尾元素的时候,nums[i] 挤掉队尾元素,成功入队。-出队的原则是,当 队列不为空并且对头元素是 i - k 的时候,也就是窗口滑倒最大元素所在的下标位置时候,元素出队。多建立一个双端队列,保证对头的元素始终是最大的元素。的滑动窗口从数组的最左侧移动到数组的最右侧。

2024-06-01 20:42:31 279

原创 438.找到字符串中所有字母异位的子串

利用一个目标子串大小的窗口滑动,每次对滑动窗口中包含的字符串计数,若是与目标相同,则返回下标。起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。的子串,返回这些子串的起始索引。技巧在于,利用一个长度为26的数组来存储计数。

2024-05-30 15:21:36 159

原创 3.无重复字符的最长子串

3.当出现重复的时候,先计算当前队列的长度,更新最大子列的长度。并且从队头不断弹出元素,直到将重复的元素弹出,这时候再将重复元素入队。2.当没有重复元素的时候,元素从队尾进入队列。4.重复上述操作,直到所有元素都完成一次遍历。,请你找出其中不含有重复字符的。请注意,你的答案必须是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。1.考虑队列,可以双端操作。,所以其长度为 3。,所以其长度为 1。,所以其长度为 3。

2024-05-30 11:09:08 172

原创 42.接雨水

再left = right 迭代。按照栈的处理顺序应该是闲处理(2,0,2)这个凹陷,只要在处理凹陷后保持大凹陷为(3,2,3)表示,大凹陷有一个高度为2的底面。这个的问题在于,当最初始的left为最大元素,而right到达边界也不能大于或等于原始left元素,但是载该内部有小凹陷可以存在雨水,也就是需要对于边界条件进行处理。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。---------单调栈---------

2024-05-27 17:24:04 348

原创 128.最长连续序列

解决本个问题的关键在于,找到一个数num,要求该数-1 (即,num - 1)在set中,再找到这组元素的最大数字,然后进行“串麻花”,将连续数字串起来,并且计数。题目要求时间复杂度为O(n), 所以需要使用hash表。但是由于只需要存储单列数据,因此使用hashset即可。set的特点在于:元素无序、唯一、可以包含空元素。在python中只需要调用set()即可,在java中Set set = new HashSet

2024-05-25 13:39:19 191

原创 138.随机链表的复制

所以复制后的链表有两个部分:原始节点(其random关系保持不变,但是每个原始节点的next都指向该节点的copy节点) + copy节点(copy节点与copy节点之间的random关系和原始链表保持一致,只是每个copy节点的next指向该原始节点的next节点)并且next指向都是 原始节点--->copy节点---->原始节点的关系,就是next指向next.next。也就是说,在每一个节点后复制生成一个新节点,该新节点的next指向下一个原始节点next的新节点;

2024-04-16 16:34:05 217

原创 41.缺失的第一个正数

2.利用数字和下标的关系。将数字大小-1与下标位置相对应。满足交换条件的数字大小为,在所需要范围内、与坐标不对应因此需要交换。3.时间复杂度在交换时候的优化。涉及到两个数字的交换,有可能出现一个是满足坐标要求,而另外一个不满足,因此判断条件涉及两个。如果交换完还是不符合坐标数字要求,则返回缺失。1.我们所需要排查的数字范围为[1,len(nums)]。·解题思路——要求时间复杂度O(n),空间复杂度O(1)————只涉及两个循环————

2024-04-16 11:33:08 218

原创 76.最小覆盖子串

这里表示,当滑动窗口中字符个数小于或等于所需要个数的时候,所需要的target_num 减一。这是因为该语句end] in need的条件下,也就是说,现在所放入的是s[end]一定是need中的字符,所以num可以减一。结束时候的判断条件就变为了,windows[s[star]] >= need[s[star]],这是因为,移动左窗口的时候,会导致所需要的元素滑出,从而影响所需要的target_num。当满足所需要求的时候,再考虑滑动窗口的左端,缩短窗口长度,获取最小窗口。————两个注意的点————

2024-04-16 10:12:55 164

原创 239.滑动窗口的最大值

2.循环窗口的长度为k, 也就是两个指标,i,和j(i表示开端,就表示末端)。—滑动窗口,如果左端滑出的值为q队列中的最大值,那么需要在滑动后将队列左端的数值弹出。—如果队列存在,并且窗口的值大于队列末端值,将队列的末端数值弹出。—当窗口左端的指标从0 开始的时候,就可以向结果数组中添加q队列的初始值。1.创建一个非增双端队列(使用collection),用来存放最大值。

2024-04-13 21:07:40 221

原创 42.接雨水

由于顺序变化了,所以每一个位置的rightmax都是由后一个位置的rightmax和该位置的height决定。每一个位置的eftmax都由前一个位置的leftmax和该位置的实际高度的最大值决定。3.再次遍历数组,每一个位置的装水量就是 leftmax和rightmax的最小值 载减去原位置的height。4.在移动的时候,由于指针式动态的,所以需要每次记录当前位置可以装的水量。——————动态规划涉及两个新数组,对此利用双指针改进————————————动态规划——————————单调栈————

2024-04-09 16:38:28 172

原创 24.两两交换链表中的结点

3.注意的点在于,要避免形成环链表。因此还是用了一个post指针,用来存放point.next.next的地址,再将point.next.next指向point,避免形成环链表,并且保证了交换的相对位置。2.在原始链表中使用指针point,先将point后一个结点挂上cur,再挂上point结点。然后point一次移动两步。1.创建一个虚拟结点,用来挂上交换后的结果。

2024-04-07 21:22:35 193

原创 19.删除链表的倒数第N个节点

5.当移除结点为尾结点时,判断条件fast.next is None and slow.next is fast,此时只需要把slow.next指向None 即可。利用快慢指针,慢指针比快指针晚出发n步。当快指针到达链表的末尾时候,慢指针正好到达要删除的元素的前一个结点,然后删除下位置结点即可。3.当移除结点为头结点,判断条件 fast is None and slow is head,此时只需要返回head.next即可。2.当n==0 时候,慢指针的位置为头结点的位置。————注意点————

2024-04-07 20:25:11 108

原创 2.两数相加

3.获取余数和进位数。将余数的数值生成节点,挂到cur上,并且更新进位数。2.两个指针分别指向两个链表,获取对应节点的val,进行相加。4.判断最末尾是否有进位数,将进位数生成节点,挂到cur上。为了减少运行时间和运行的内存消耗,精简代码。1.创建一个虚拟节点用来存放产生的结果。

2024-04-07 14:58:21 216

原创 21.合并两个有序链表

2.两个指针分别在list1 和 list2 中移动,比较指针的val至,将小的数值,挂到cur上。3.如果list1 或者 list2 还有剩余,那么就将剩余链表直接挂到cur上。1.先创建一个虚拟头节点。

2024-04-07 11:15:21 131

原创 142.环形链表2

—当链表存在环的时候,快慢指针第一次相遇之后,手动将快指针的指向调整为头节点,慢指针的位置保持不变,此后快慢指针的步调都调整为1。此后快慢指针再次相遇的时候,即为头节点所在位置。——开始的时候完全没有get到进阶的意思,与环形链表1不同的是,当链表存在环的时候,快慢指针一定会在环中相遇,因此简单题只需要返回True就可。环形链表2需要返回环的头节点。——————想过证明,没证出来。但是画图验证的时候果真如此————

2024-04-07 10:42:46 193

原创 141.环形链表

时间复杂度O(n),空间复杂度O(1)。当最后一个指针回指到头节点的时候,slow指针再次回到头节点的时候,slow和fast相遇,所以时间复杂度为O(n)2.每次遍历先判断地址是否在哈希表中,若在则直接返回True;否则,将地址装如哈希表,并且cur指针向后移动。1.cur指针遍历链表,并且创建哈希表,用于记录节点的地址。——————遍历链表,哈希表记录节点——————————————快慢指针遍历——————时间复杂度O(n),空间复杂度O(n)

2024-04-07 09:43:07 170

原创 234.回文链表

3.对比原始链表的全部分和后部分是否数值一致,若均一致那么就是回文链表。_____________代码改进_____________2.转数组,若是保持不变就是回文链表。2.利用中间点将后部分链表进行翻转。1.利用快慢指针找到链表的中间点。1.将链表的数值进行记录。

2024-04-06 21:02:45 137

原创 160.相交链表

若两链表 有 公共尾部 (即 c>0c > 0c>0 ) :指针 A , B 同时指向「第一个公共节点」node。若两链表 无 公共尾部 (即 c=0c = 0c=0 ) :指针 A , B 同时指向 nullnullnull。头节点 headB 到 node 前,共有 b−c 个节点;头节点 headA 到 node 前,共有 a−c个节点;————看评论区大神的思路————因此返回 A 即可。

2024-04-06 18:20:15 322

原创 48.旋转图像

1.矩阵转置:对于第一行第一列元素对应交换。然后row+= 1,col+= 1,表示转置的矩阵缩小一圈,第一行第一列的位置更新 2.矩阵左右交换:若矩阵col为奇数,先找到中间middle(该col不需要交换),对于middle左右的两列相互交换。交换完成,左边列减一,右边列加一,表示不断向外扩展。·解题思路——————将旋转拆分为两步计算:转置和交换。

2024-04-06 16:24:32 172

原创 54.螺旋矩阵

3.需要注意的是,第一排遍历完,top += 1;最右边,right -= 1;最下边 bottom -= 1;最左边 left += 1。2.遍历顺序:第一排的从左至右;1.螺旋 == 绕圈。所以就是绕圈遍历矩阵。

2024-04-06 15:09:36 229

原创 73.矩阵置零

2.读取flags中的元素,获取要置为0的行列值,然后两个循环将matrix中的对应元素置为0。1.遍历原矩阵,记录0位置的行列值,存入数组flags中,作为标志。1.将原始需要记录行列的数组flags改为两个哈希表row和col。——————改进优化,使用哈希表————————————初步思路,暴力求解——————2.遍历矩阵将0位子的行列分别存入哈希表中。

2024-04-03 14:41:56 330

原创 .238.除自身以外数组的乘法

2.稍作优化——先判断是否有0存在,若是在乘积的余下数组中有0直接判断为0 (但是只是最优时间复杂度减少,没什么大作用)1.利用pre数组记录每个元素的前缀积,pre[0]= 1 (图解如下,来源力扣官网)(同样的思路,也可以先用resul记录后缀积,动态字母L记录前缀积,L从前往后移动即可)————————牺牲空间换时间(两个额外数组空间,记录前缀积和后缀积)——————————————时间换空间(for循环暴力求解)—————————————————兼顾时间和空间————————

2024-04-03 10:52:22 263

原创 189.轮转 数组

2.使用k将原始数组分为两个部分nums[:n-k] (前部分) 和 nums[n-k:](后部分)3.前部分的子数组的位置改为 nums[k:] 后部分的子数组位置改为 nums[:k]1.其实向后轮转的时候,有部分元素之间的相对位置是不变的,因此可以使用切片的思想进行轮转。(上述代码时间复杂度为O(kn),在leetcode提交的时候37/38算例会超时。2.调用循环,当k>0的时候,不断向后冒泡,并且每次冒出一个元素后k-1。—————冒泡排序的超时算法————————————改进————

2024-04-02 22:38:41 130

原创 56.合并区间

2.先判断头两个数组是否可以合并,若是可以合并则直接将合并的结果加入到result数组中;若是不能合并,那么就将两个数组都加入到result数组中。3.进入循环,每次判断获取的数组是否可以和resul最后一个元素合并,若是可以合并,则先弹出数组的末尾元素,然后再添加合并后的结果。4.若是获取的数组不能和result末尾数组合并,那么就直接将获取的数组添加到result中。1.先对数组进行排序。

2024-04-02 18:35:18 173

原创 53.最大子数组的和

动态规划:1.主题的思路是递加;2.当传输的前一个递加结果为负数的时候,递加的和结束,从当前开始,及时止损。

2024-04-02 16:33:15 91

原创 560.和为k 的子数组

首先是两个for循环暴力求解,然后导致验证超时。转为使用哈希表来记录出现的和的次数。————————暴力求解超时代码————————————哈希表————————

2024-04-02 15:44:12 111

原创 438 找到字符串中所有字母异味词

之前的思路都是滑动窗口循环,但是事实证明想多了只需要每次对s字符串中len(p)长度的子字符串进行计数就可以了。只是计数的时候,选择使用哈希表,下标采用编码值(但是其实采用字典应该也可以)只是时间复杂度会高。1.统计第一个子字符串的字母出现次数。若是与count-p相同,则增加0。2.在字符串s中,进行移位,并且统计次数。

2024-04-02 12:04:16 136

空空如也

空空如也

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

TA关注的人

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