自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode算法实战(6-10)

下给出我的思想过程:对于示例1,我们先判断1的旋转逻辑,1占用了3的位置,3占用了9的位置,9占据了7的位置,7占据了1的位置。这道题中的 d[i, j] 代表的是,以坐标点(i,j) 为右下角的最大正方形,如果说你的 d[i,j] 是想 这个区域中 最大的正方形,那可就麻烦太多了。典型的动态规划问题,对于一般情况,我们取dp【i】【j】=min(dp【i-1】【j】,dp【i】【j-1】)+1,分别赋值边界情况,最后取dp【m】【n】即可。

2025-06-12 09:18:14 212

原创 leetcode算法实战(6-9)

例如题解给出的方案是将两个0-7的随机整数相乘,得到的是0-49的整数,然后在这些概率分布中找10个概率相等的事件产生映射即可。你直接 result.append(path),但实际上 path 是一个列表,在后续的回溯中会被修改,导致 result 中存储的所有结果都指向同一个 path 的引用。是一种特殊的二叉搜索树(BST),它的主要特点是任意节点的左右子树高度差不超过 1,这样可以保证树的查找、插入、删除等操作的时间复杂度稳定在 O(log n),避免退化成链表(O(n))。

2025-06-12 09:16:51 1492

原创 leetcode算法实战(6-8)

这种题目屡见不鲜,使用dfs进行遍历,利用哈希表或者传值的方式减少重复迭代,到根节点取其与max_deep的较大值。看到括号匹配类似的问题,我们还是先考虑栈。借助栈来确定括号内需要重复的字母。在之前的学习中,我们已经给出了详细的二叉树前,中,后序遍历的迭代与递归解法,这里不在进行赘述。时,将当前解析的倍数和当前字符串入栈,并重置临时变量(解析数字)。遇到数字时,解析完整的数字(因为数字可能不止一位)。时,弹出栈顶的倍数和字符串,进行字符串的重复操作。遇到字母时,直接添加到当前字符串中。

2025-06-12 09:06:49 304

原创 leetcode算法实战(6-7)

题目要求了时间复杂度,一开始的想法便是考虑使用二分查找,当哨兵元素等于target的时候,使用双指针找到第一次出现和最后一次出现的索引。给出样例代码:但是该算法并不是最优解,双指针部分很容易退化到O(n)。接下来考虑如何进行优化:优化点肯定在双指针的部分,当哨兵元素等于target的时候,我们可以对左右两部分在进行二分查找以确定边界。此时已经达到最优解,给出样例代码:考虑还有其他方式实现吗,推排序可以解决数组中第k大的元素,也许可以解决这类问题?

2025-06-12 08:54:04 324

原创 leetcode刷题实战(6-6)

但是稍加思考就会发现单纯的dfs存在太多重复计算,对此我们采用字典存贮部分遍历结果,使得在进行递归某棵子树的左右节点时只需要遍历一次(假设左节点已经遍历,则父节点对应的值已经知晓)。该题首先肯定要利用按空格划分单词的函数将原字符串分为若干个子字符串,然后修改子字符串顺序,再在每个子字符串之间加入空格即可。非常经典的回溯法模板题,该题不需要if来终止,只需要遍历nums,对于nums的某一个字符,执行加入和不加入两种方式即可。经典的dfs或者动态规划都可以解决的问题,之前遇到过类似的情况。

2025-06-12 08:51:37 308

原创 leetcode刷题实战(6-5)

这是二叉树的经典例题,我们可以知道在先序遍历的某个元素,其在中序遍历的对应位置,左侧为左子树,右侧为右子树,使用递归进行简历即可。我们可以参考之前使用的堆排序求解数组第k大(小)的元素,我们将负数设为无限大,然后依次弹出第k小元素,将其与k进行比较,如果不同就可以得到答案。另外可以考虑使用双指针,快指针比慢指针快cnt个,当快指针到null时,慢指针对应的就是所需要的值。,如果不是,就需要将其放置在正确的位置。考虑使用栈的思想,将链表元素全加入栈后,弹出的第cnt个元素就是需要的元素。

2025-06-12 08:50:03 159

原创 leetcode算法实战(6-4)

在做这个题目之前,我们需要先复习一下字符串加法,需要注意的是题目指出的不允许将输入转整数是不能直接将字符串转,但是某一位转还是没什么问题的。我们在做字符串加法的时候,使用的是类似于二路归并算法,构建一个半加器,考虑进位。对于子串问题我们一般考虑滑动窗口和动态规划,在此我们考虑滑动窗口的方式,使用左右指针,右指针遍历字符串s,直到字符串t均在s中出现后,开始收缩左边界,并更新最小覆盖字串。这是需要时刻注意并记忆的东西,使用深度优先并不可取,很多时候均会超时,需要借助字典将复杂度降下来。

2025-06-12 08:45:55 210

原创 leetcode刷题实战(6-3)

该题目代码的思维并不复杂,但是需要判断多种情况,这需要思考很多,题解给出一种自动机的思想,其概述如下:我们的程序在每个时刻有一个状态 s,每次从序列中输入一个字符 c,并根据字符 c 转移到下一个状态 s'。这样,我们只需要建立一个覆盖所有情况的从 s 与 c 映射到 s' 的表格即可解决题目中的问题。典型的动态规划问题,有dp【i】种方式到i级台阶,状态转移方程为dp【i】=dp【i-1】+dp【i-2】栈长度 = 1,字符串长度 = 6,你的方法返回。(长度 6),此时你的方法正确,但只是巧合。

2025-06-08 09:06:07 1438

原创 leetcode刷题实战(6-2)

我们对1-x进行二分查找,初始时left=1,right=x,取mid=(left+x/2),对mid*mid与x进行对比,同时优化left和right位置即可。每当我们向右移动窗口时,我们就可以把一个新的元素放入优先队列中,此时堆顶的元素就是堆中所有元素的最大值。我们不断地移除堆顶的元素,直到其确实出现在滑动窗口中。因此,当我们后续继续向右移动窗口时,这个值就永远不可能出现在滑动窗口中了,我们可以将其永久地从优先队列中移除。我们可以借助最大堆的特点,快速的找到窗口中的最大值。结尾的滑动窗口的最大值。

2025-06-08 09:04:15 405

原创 leetcode算法实战(6-1)

我们这样思考这个问题,如何找到下一个排列呢,在不考虑原数组为倒序排列时,我们普遍认为应该从后向前找到这样两个元素,这两个元素前<后,这样我们就可以修改两者顺序,得到下一个排列。借助deepseek,上述思路基本正确,但还是有需要修改的地方,我们是先要从后到前找到一个升序对nums[i] < nums[i+1],如果没找到,逆序返回数组。如果考虑直接对链表进行排序的话,可以考虑使用类似于冒泡排序的方法,多遍的遍历链表,如果出现前一个比后一个大的情况,交换链表顺序。遍历链表,将所有节点的值存入数组。

2025-06-03 18:09:54 300

原创 leecode算法实战(5-31)

题解给出另一种思路,对于pop操作和peek操作,可以不将栈B返回到栈A。但是这样的操作会加入额外的判断,有利有弊吧,两者均可。首先的操作肯定是使用.对原字符串进行分割,得到若干子数组,然后将两数组补成相同长度,缺省补0。对于pop操作,我们先将栈A的元素全部加入到栈B,然后返回栈B的第一个元素并删除,再将栈B的元素返回栈A。栈和队列的关键区别就是先入先出还是先入后出,我们考虑使用两个栈实现队列。分别命名为栈A和栈B。递归的代码量虽然不多,但是想清楚逻辑是有难度的,主要是return左边部分还是右半部分。

2025-06-03 18:07:49 190

原创 leetcode算法实战(5-30)

该题解给出的思路的时间复杂度为O(log (m+n)),但是还存在可以优化的地方。我们可以只查找一个数组,将复杂度降为O(log (min(m,n)))。因为我们要找的前k个元素多少是确定的(k=(m+n)/2),假如知道在数组1删除i个,那么在数组2就要删除k-i个。接下来该如何确定i的大小呢,借助二分查找,先将其确定为数组1的中值,判断数组2的对应值,判断两者大小。思路为借助队列,但每次只将节点的右孩子加入队列,稍加思考发现存在较大问题,假如某层的某个节点不存在右孩子,那么看到的可能是左孩子。

2025-06-03 18:06:35 312

原创 leetcode算法实战(5-29)

参考题解的思路,我们在思考最优路径是否要将某个节点加入时,可以考虑这个节点对最优路径的贡献度,如果贡献度大于0,则可以考虑将其加入,否则不将其加入。刚开始思考这个题目时候感觉和求 连续子数组最大和 题目思想一致,考虑使用动态规划,但稍微思考就发现问题所在,父节点的索引很难确定(当然也可以确定,这个排序方式和堆排序的构建很相似),难以确定索引的前提下后续的状态转移方程的构建更是天方夜谭。题解给出的双指针方案,无需引入额外空间,利用链表有序的特点,如果重复,则后一个必定和前一个值相同,则进行删除即可。

2025-06-03 18:04:36 353

原创 leetcode算法实战(5-28)

选择哨兵元素,将小于哨兵元素放置在一边,大于放在一边。可以选择原地快排或者借助数组快排。也可以使用迭代的思想,设置相邻两个节点,修改两者的连接关系。将原数组分为若干个子串,分别对这些子串使用二路归并。对于二叉树的最近公共祖先,这个题目参考题解进行求解。对于回溯法,要多花一些时间掌握模板。(交换顺序的原地快速排序)(借助数组的快速排序)

2025-06-03 18:03:13 185

原创 leetcode算法实战(5-27)

今天花一些时间将前段时间做的大约30道题目做一个小结。

2025-05-30 16:40:11 791

原创 leetcode算法实战(5-23)

该题目是典型的回溯法思想,相较于常规的回溯法,该题目增加多个判断,判断是否达到s的末端,判断是否有4个整数段,判断是否在0-255之间,如果三者均满足,则将对应结果加入输出数组中。之前做过环形链表1,是作为判断一个链表是否有环,当时使用的快慢指针的方法,实际上可以借助哈希表,将每个节点加入哈希表,如果有环则会出现节点已经存在的现象。如果借助哈希表的话,该题目也十分简单,当出现节点已经存在的现象时,该节点即为环的头节点。

2025-05-30 16:26:58 297

原创 leetcode算法实战(5-22)

运行上述代码会提示超时,深究其原因,本质是在递归过程中存在太多重复性的操作,存在某些遍历路径存在多次重复求取,考虑使用额外的存贮空间来加速迭代。考虑使用dfs遍历所有可能,记录每种操作的编辑距离,取操作最少的作为编辑距离。上述代码属于最优求解复杂度。在单词A中插入一个字符。在单词B中插入一个字符。

2025-05-30 16:22:56 155

原创 leetcode算法实战(5-20)

思路如下:创建一个空列表results,遍历一遍数组intervals,在每次遍历时再遍历results,如果interval的头元素大于result的尾元素,置一个标签位,将result【1】=max(result【1】,interval【1】),break,检查标志位,判断是否需要将interval加入results中。一开始考虑快慢指针,假如快指针从A链表遍历,慢指针从B链表遍历,如果存在相交,在若干次迭代后,快慢指针会相交(直觉)有这样的数学证明后,上述思路成立。先找到数组最大值和对应的下标,

2025-05-30 16:18:27 301

原创 leetcode算法实战(5-19)

上述思路存在一个明显问题需要优化,我们不能重新生成链表,而应该在原链表基础上进行修改。之前做过一个合并两个有序链表的题目,一个朴素的解法是将这k个有序链表转换为若干个两个有序链表,类似于快速排序的思想。快指针比慢指针每次多走一步,如果快指针到终点,慢指针在中点。观察题解:题解的意思使用双指针,从最后一位开始遍历,模拟加法。没懂这题想考什么,如果可以直接使用字符串转数字函数,感觉没有考察的必要。参考题解给出的方案,本题目考察链表中点,逆序,拼接。参考之前做的反转链表,使用递归即可,

2025-05-30 16:11:01 250

原创 leetcode算法实战(5-15)

思考这样一个问题,我们如何才能构建一个以nums【i】为结尾的最长递增子序列呢,一个想法是我们先找到dp【0:i-1】最大的元素,设其下标为j,然后比较nums【j】和nums【i】的大小,如果nums【i】更大,那是最简单的,令nums【i】=nums【j】+1即可。换一个角度思考这个问题,对于dp【i】,我们遍历0-i,如果nums【i】>nums【j】,则记dp【i】=max{dp【i】,dp【j】+1}。但是该思路的实际为O(n2),考虑如何降低复杂度,题解给出另一种贪心算法。

2025-05-30 16:08:35 254

原创 leetcode算法实战(5-14)

今日对前段时间所作算法进行小结。

2025-05-30 16:04:57 238

原创 leetcode算法实战(5-13)

将该思路用于该题目就不难求解了,我们使得快指针和慢指针均位于head,快指针一次走两步,慢指针一次走一步,终止条件为快指针,next==none或快指针==慢指针,分别返回false和true即可。但是看题解又感觉很简单,题解给出的思路是通过先序遍历在二叉树中找到p和q元素,改遍历同时保留了root元素,当找到q和p的时候,返回root即可。该题目易想到使用哈希表的方式,将遍历过的节点加入哈希表(注意加入的是节点而不是value),每遍历一次,判断next节点在不在哈希表中即可。考虑使用快慢指针即可。

2025-05-30 15:52:59 314

原创 leetcode算法实战(5-12)

在遍历数组的时候,需要使用一个变量存贮遍历到现在的最小价格,同时更新利润最大值(取最大利润与新价格减最小价格的最大值),需要指出的是,买入的时机并不一定是价格最低时,而是利润差距最大的时候。[ 5 , 6 , 7 , 8 , 999999 , 1 , 2 ],这个数组在遍历的时候,遍历到1时,虽然最低价格会更新,但是后续利润最大值不会在被更新。使用二路归并算法对该题目进行处理,如果指针从数组前端开始移动,则每移动一次,后续数组均需要移动,故指针从两个数组的末端开始向前遍历即可。

2025-05-30 15:47:39 284

原创 leetcode算法实战(5-11)

对于一个二维网格,同时定义一个矩阵表示某点是否被搜寻(0表示未搜寻,1表示已搜寻),对于某个网格,其(上下左右)四个网格中为搜寻的矩阵中均为0(水),认为该网格时岛屿的边界。从网格第一个1(陆地)开始,按照右,下,左,上的顺序进行遍历,遍历到边界停止,整个遍历结束后,岛屿数量加1。将字符串逐字符加入栈中,加入前判断栈顶元素和要加入的元素是否组成括号(使用字典存储对应关系),当字符串遍历完后,判断栈是否为空,若不为空,则返回false,否则返回ture。循环横向遍历,递归纵向遍历,回溯不断调整结果集」

2025-05-30 15:41:17 361

原创 leetcode算法实战(5-10)

我开始的设计是将二叉树的所有节点均一次性加入队列,然后按照一层有2n-1个节点,不足的作为最后一层节点输出,这样的设计在对完全二叉树时是正确的,但是如果一个二叉树的左边基本无节点,右边有无数节点,该思路出现明显错误。单纯搜索,易想到O(1)的哈希查询和O(n)的遍历查询,题目要求复杂度为时间复杂度为 O(log n) ,易想到快速排序或归并排序,在此给出快速排序(查询)的一种思路。该思路实际进行了两次快速查找(二分查找),第一次为定位旋转元素,第二次为进行查询,整体时间复杂度依然为O(log n)

2025-05-30 15:37:52 321

原创 leetcode算法实战(5-9)

对于字符串S,考虑对于S[i],计算以S[i]为中心,回文子串个数为奇数的最长子串为value1;如果有S[i]==S[i-1],则计算回文子串个数为偶数·的最长子串为value2,取value=max{value1,value2},每次遍历将最大值存储,遍历完字符串得到最长回文子串。中心扩展法的核心思想是:对于每一个字符,尝试以其为中心向两边扩展,找到最长的回文子串。同时,考虑到回文串的长度可能是奇数或偶数,因此需要分别处理以单个字符为中心和以两个字符为中心的情况。

2025-05-30 15:08:59 276

原创 leetcode算法实战(5-8)

堆排序看不懂,后面再说,对于三种算法给出详细解释和过程。第二行(2,j)表示由数组第二个元素开始,到第j个元素和,易知对于(i,j),只有j大于等于i的部分被赋值,其余部分不妨设为0,建立状态转移方程,对dp正确赋值后,取max(dp)即可。题解给出的动态规划为一维数组dp,dp【i】表示以nums【i】为最后元素的连续数组最大值,即dp【i】=max(dp【i-1】+nums【i】,nums【i】),这样只需要遍历一遍数组,甚至考虑到最后只需要dp数组中的最大值,也可将一维数组转为一个变量储存。

2025-05-30 15:07:39 344

原创 leetcode刷题实战(5-7)

思考后选择设置一个右指针,对递增排序的数组从右向左遍历,如果nums[i]==nums[i-1],则证明重复了,则k不变,如果nums[i]<nums[i-1],则k=k-1,终止条件为k<=0,返回最后指针的元素即可。容易想到O(n3)的算法,但很明显会超时,考虑使用o(n2),引入哈希表,使用两层循环i,j,将除去num[i],nums[j]的元素全部加入哈希表,借助哈希表查询是否存在- num[i]-nums[j],降低复杂度。建议一开始稍微遍历几次,选择一个相对较大的元素以降低遍历次数。

2025-05-30 14:58:18 252

原创 leetcode刷题实战(5-6)

对于插入操作,我一开始的想法是直接插入字典(o(1)),然后维护一个数组,数组存放key(方便哈希表的定位),其顺序为最近使用时间,即数组[0]即为最早删除元素,借助pop和append维护数组顺序,但是如果对数组中间的某个元素进行查询,则需要修改其顺序,该操作为o(n),失败。原思路存在判断某字符是否在滑动窗口内存在思路冗余问题,事实上无论该字符是否在滑动窗口中,均需要加入滑动窗口(若不在,直接加入;该代码选择用字典存储某个元素出现的最后一次的索引,这样滑动窗口的删除只需要一步,而不需要进行遍历。

2025-05-30 14:56:41 333

原创 区分已知物体-未知物体-背景的开放世界检测

在传统的物体检测中,输入为图像和该图像中存在的若干物体。这种模式存在一种隐患,在现实生活中拍摄的影像存在“意外”,例如在海边拍照可能会不合时宜的出现一架飞机,在训练集中我们很难满足涵盖所有情况的影像,此时,开放世界检测OW-DETR产生。

2025-05-05 11:34:27 298

原创 通用LiDAR分割的多空间对齐M3NET网络概述

目前主流的LiDAR影像分割在单一数据集时表现良好,但对于多模态数据表现较差。为了实现安全的自动驾驶(LiDAR影像多用于自动驾驶的影像重建)感知,需要一种统一、通用、鲁棒性和泛化能力强的LiDAR分割模型。该文提出了一种种基于M3Net的LiDAR图像分割框架,该框架能够以一种通用的方式使用一组参数实现多任务、多数据集、多模态的LiDAR图像分割。

2025-05-05 11:32:10 321

原创 GAN生成式对抗网络(part1)

一般来说,判别式网络通过接受一组数据进行预测,生成式网络通过接受一组数据产生对象。而GAN将二者结合。生成器(Generator)负责生成模拟数据;判别器(Discriminator)负责判断输入的数据是真实的还是生成的。生成器要不断优化自己生成的数据让判别网络判断不出来,判别器也要优化自己让自己判断得更准确。二者关系形成对抗,因此叫对抗网络。GAN的原理就是利用生成式网络和判别式网络的互相博弈而产生好的输出。在GAN的原作中,作者将生成器比喻为印假钞票的犯罪分子,判别器则类比为警察。

2024-11-01 11:37:36 1885

空空如也

空空如也

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

TA关注的人

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