![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leedcode_Hot100
文章平均质量分 62
半截詩
这个作者很懒,什么都没留下…
展开
-
力扣(动态规划)-343整数拆分;96不同的二叉搜索树
所以这里遗漏了一种情况:若是i-j不进行划分时得到dp[i]的最大值,那么dp[i]=j*(i-j)从递推公式dp[i]=j*dp[i-j]可以看出后面的结果是由前面i-j推导出来的,所以i⼀定是从小到大遍历,先有dp[i - j]再有dp[i]此时由于j不会再被划分,所以要使dp[i]最大,则 就要对(i-j)进行拆分使得拆分后的几个整数的乘积最大,即dp[i-j]。综上所诉,我们的递推公式应该是dp[i]=max( j * dp[i-j], j*(i-j) )返回你可以获得的最⼤乘积。原创 2024-08-24 21:20:38 · 211 阅读 · 0 评论 -
力扣Hot100-208实现Trie(前缀树)-华为/腾讯面试题(重难点)
是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。// 返回 False。// 返回 True。// 返回 True。// 返回 True。1.不理解创建的对象,函数之间的调用关系。(发音类似 "try")或者说。原创 2024-08-19 15:25:52 · 250 阅读 · 0 评论 -
力扣Hot100-207课程表(vector初始化问题,拓扑排序)
你这个学期必须选修numCourses门课程,记为0到。在选修某些课程之前需要一些先修课程。先修课程按数组给出,其中,表示如果要学习课程ai则先学习课程bi。[0, 1]01请你判断是否可能完成所有课程的学习?如果可以,返回true;否则,返回false。true总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。这是可能的。false总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0;并且学习课程 0 之前,你还应先完成课程 1。这是不可能的。原创 2024-08-11 15:20:23 · 209 阅读 · 0 评论 -
力扣Hot100-994腐烂的橘子
由于在找到腐烂水果后直接将它周围的水果置为腐烂水果,但是可能当前轮次腐烂的水果,又在当前轮次中影响周围水果,导致错误,所以可以标记:在不同轮次中被传染腐烂的水果标记为不同的数字,由于一开始time=0时,腐烂水果标记为2,所以在time=0到1这段时间被传染的水果标记为2+time+1,这样就可以使得本轮time=0时不会让标记为3的水果传染它周围的水果。左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0。原创 2024-08-10 22:52:22 · 389 阅读 · 0 评论 -
力扣Hot100-200岛屿数量(图论 * DFS遍历)
网格问题是由 m×n 个小方格组成一个网格,每个小方格与其上下左右四个方格认为是相邻的,要在这样的网格上进行某种搜索。岛屿问题是一类典型的网格问题。每个格子中的数字可能是 0 或者 1。我们把数字为 0 的格子看成海洋格子,数字为 1 的格子看成陆地格子,这样相邻的陆地格子就连接成一个岛屿。在这样一个设定下,就出现了各种岛屿问题的变种,包括岛屿的数量、面积、周长等。不过这些问题,基本都可以用 DFS 遍历来解决。原创 2024-08-10 11:53:52 · 955 阅读 · 0 评论 -
力扣Hot-124二叉树中的最大路径和(p523二叉树直径的变形)
/2该路径不一定是从一个叶节点到另一个叶节点,所以,当左子树/右子树均为负数时,返回的最大值为当前节点值node(不需要再判断node的正负,当它作为子节点扔为负数时,会被舍弃)被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。//易错:1,可能出现左右子树为负数,此时以node为根的最大值应该为node自己。最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42。最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6。节点,且不一定经过根节点。原创 2024-08-10 11:00:14 · 304 阅读 · 0 评论 -
力扣Hot100-236二叉树的最近公共祖先
中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(两个节点中最高的那个节点p,因此将高度较矮的节点q沿着他的父节点向上爬,直到与另一个节点p在同一高度,否则,p,q两个节点都沿着父节点向上走,直到p,q指向同一个节点。再判断当前p,q是否为同一个节点,是则说明找到公共祖先。因为根据定义最近公共祖先节点可以为节点本身。两个节点的最近公共祖先所在的。的最近公共祖先是节点。的最近公共祖先是节点。原创 2024-08-09 11:49:50 · 309 阅读 · 2 评论 -
力扣Hot100-路径总和iii
例如:在下面图中,遍历左子树:10->5->3(1)->3(2)之后开始从3(2)回溯到节点3(1),此时需要减掉3(2),再开始遍历右子树,将3(1)的右孩子-2的值加入求和。将树中的节点分别视为根节点,从根节点开始使用前序遍历求和,当左子树节点遍历完后开始回溯,回溯时将加入计算的左子树值剪掉,继续计算右子树值。不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。//2:路径往下值得是各个节点不在同一层,但可以是根,左,右,不一定全是在左边。原创 2024-08-09 10:36:27 · 285 阅读 · 0 评论 -
力扣Hot100-114二叉树展开为链表
思路:我们知道前序遍历的访问顺序为根->左->右,可以观察到在遍历时二叉树最左边的顺序就是访问顺序,只有当前访问的节点没有左节点时,才会开始访问右节点,所以,我们可以用pre记录前一个访问的节点, 站在pre节点的角度来看,若是pre没有左孩子,则下一个访问pre右分支上的节点Node,且可以将pre的左分支指向下一个访问的节点Node,实现将访问顺序记录到二叉树的左分支上,从根节点开始访问其左孩子,可以得到先序遍历的顺序。若pre节点有左孩子,下一个访问的即是pre的左孩子。额外空间)展开这棵树吗?原创 2024-08-08 10:38:57 · 1005 阅读 · 0 评论 -
力扣Hot100-199二叉树的右视图
想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。从右侧看,所以优先存在右孩子,因此遍历顺序为 根节点->右孩子->左孩子。思路:由于要从上到下的循序,所以应该先访问根节点;的节点 的高度,则当前节点也要放入访问队列中。若当前节点高度大于等于。原创 2024-08-07 11:03:11 · 361 阅读 · 0 评论 -
力扣Hot100-230二叉搜索树中第K小的元素
二叉树的中序遍历即按照访问左子树——根结点——右子树的方式遍历二叉树;在访问其左子树和右子树时,我们也按照同样的方式遍历;因此本题转化为对二叉树进行中序遍历,常见的遍历方式有:递归和迭代(使用栈)所有左子树和右子树自身必须也是二叉搜索树。结点的左子树只包含小于当前结点的数。结点的右子树只包含大于当前结点的数。二叉搜索树的中序遍历为一个递增序列。,请你设计一个算法查找其中第。小的元素(从 1 开始计数)。给定一个二叉搜索树的根节点。或左节点已经被访问过。原创 2024-08-07 10:37:28 · 480 阅读 · 0 评论 -
力扣Hot100-98验证二叉搜索树(递归,深度优先搜索,c++)
根节点的值是 5 ,但是右子节点的值是 4。,判断其是否是一个有效的二叉搜索树。//易错:左子树值等于根值也不是。给你一个二叉树的根节点。原创 2024-08-06 15:52:22 · 810 阅读 · 0 评论 -
力扣Hot100-108将有序数组转为二叉搜索树(BST的特点)
给你一个整数数组nums,其中元素已经按排列,请你将其转换为一棵平衡二叉搜索树。[0,-10,5,null,-3,null,9] 也将被视为正确答案:[3,1][1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。原创 2024-08-06 14:46:01 · 187 阅读 · 0 评论 -
力扣Hot100-543二叉树的直径
二叉树上的任一“路径”上一定有一个结点是所有其他结点的祖先结点(因为“路径”是由一个个父子关系连接而成的),那么换个表述方法,对于任一结点,以此结点为根的diameter就可以表示为左子树高度 + 右子树高度,而二叉树的diameter(直径)就是所有结点为根的diameter中最大的那个。在下图中,判断完节点2后要回溯到节点1继续判断,此时节点1的左子树高度为节点2的左子树高度和右子树高度中的最大值,再加1,即l(1)=max[ l(2) ,r(2)]+1,其中l(2)表示节点2的左子树高度。原创 2024-07-25 16:48:22 · 417 阅读 · 0 评论 -
力扣Hot100-94二叉树的中序遍历
注意:在压入左孩子时要判断这个左孩子是否被访问过,eg:在[1,null,2,3]中3被访问后,节点2在栈最上面,进入循环后断2是否有左孩子,2有左孩子节点(3),但是已经被访问,若是再次入栈会陷入死循环。使用栈:当栈不为空时,对当前栈中最上面的节点进行判断,如果节点存在左孩子,且左孩子没有被访问,则将左孩子压入栈,不存在左孩子则将当前最上面节点弹出栈,并判断其是否有右孩子,有则压入栈。递归算法很简单,你可以通过迭代算法完成吗?给定一个二叉树的根节点。原创 2024-07-21 14:45:03 · 327 阅读 · 0 评论 -
力扣Hot100-148排序链表(插入排序/归并排序)
给你链表的头结点head,请将其按排列并返回。[1,2,3,4]head = [][]方法一:插入排序,但是由于链表是无序的,插入排序在最坏情况下的时间复杂度是 O(n^2),这对于较大的输入会导致超时插入排序思想,依次对未排序的节点插入到已经有序的链表中你可以在O(nlogn)时间复杂度和常数级空间复杂度下,对链表进行排序吗方法二:归并排序归并排序在链表排序中表现良好,归并排序(Merge Sort)是一种基于分治法的排序算法,具有稳定的排序表现,时间复杂度为 O(nlogn)。原创 2024-07-16 15:29:51 · 1026 阅读 · 0 评论 -
力扣Hot100-24两两交换链表中的节点(三指针)
思路:要实现两个节点node1,node2的交换必然需要三个指针实现,其中两个指针分别指向两个节点,另一个指针指向node1的前一个节点。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。为使后续节点也能循环使用该代码,需要将p,q,w分别按照相对位置指向下一对要交换的结点。原创 2024-07-03 23:47:21 · 276 阅读 · 0 评论 -
力扣Hot100-19删除链表的倒数第n个节点(双指针)
要删除的节点Node为倒数第n个,当n已知后,要删除的节点与最后一个节点之间的距离是已知的,设为s。可以使用双指针p,q,将两个指针的距离调整为s+1,此时保持两个指针距离不变,对两个指针下移,直到指针q指向链表的最后一个节点时,指针p指向 要删除节点 的 前一个节点 。修改p->next=p->next->next便可实现删除倒数第n个节点。原创 2024-07-03 23:38:49 · 406 阅读 · 0 评论 -
力扣Hot100-2两数相加(反转链表)
根据加法的计算公式,我们应该知道要先将两个多位数(整数:a3a2a1和整数:b2b1)[a1代表一个阿拉伯数字]的地位对齐,从最低位开始相加,产生的进位传递给更高位,参与更高位的加法计算。为了将尾数对齐,可以采用反转链表的方式,此时得到a1a2a3和b1b2,按照顺序对两个链表的数进行相加,保存进位,两个链表中的指针下移继续相加,知道两个链表都结束(其中一个链表结束视为与零做运算)。的链表,表示两个非负的整数。请你将两个数相加,并以相同形式返回一个表示和的链表。的方式存储的,并且每个节点只能存储。原创 2024-07-02 23:36:09 · 471 阅读 · 0 评论 -
力扣Hot100-141环形链表(「Floyd 判圈算法」(又称龟兔赛跑算法)/哈希表)
方法二:使用快慢指针,慢指针一次走一步,快指针一次走两步,当快慢指针相遇时则说明存在环:(用时较短,但两者时间复杂度都是O(n))方法一:使用哈希表记录已经访问过的节点地址,遍历链表判断当前节点是否已经出现过,出现过则出来环,未出现则不存在环。原创 2024-06-24 16:20:22 · 318 阅读 · 0 评论 -
力扣Hot100-有效的括号(栈stack)
思路:由于括号都配对的,且从头开始扫描可以发现,最后出现的左括号,他对应的右括号往往最先出现(eg:"{ ( { [,判断字符串是否有效。原创 2024-05-30 17:03:18 · 458 阅读 · 0 评论 -
力扣Hot100-搜索二维矩阵II
因此,通过从 “根节点” 开始搜索,遇到比 target 大的元素就向左,反之向右,即可找到目标值 target。链接:https://leetcode.cn/problems/search-a-2d-matrix-ii/solutions/2361487/240-sou-suo-er-wei-ju-zhen-iitan-xin-qin-7mtf/每轮 i 或 j 移动后,相当于生成了“消去一行(列)的新矩阵”, 索引(i,j) 指向新矩阵的左下角元素(标志数),因此可重复使用以上性质消去行(列)。原创 2024-05-29 11:36:57 · 456 阅读 · 0 评论 -
力扣Hot100_54螺旋矩阵(注意思想:重新定义边界)
这里的方法不需要记录已经走过的路径,所以执行用时和内存消耗都相对较小首先设定上下左右边界其次向右移动到最右,此时第一行因为已经使用过了,可以将其从图中删去,体现在代码中就是重新定义上边界判断若重新定义后,上下边界交错,表明螺旋矩阵遍历结束,跳出循环,返回答案若上下边界不交错,则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理不断循环以上步骤,直到某两条边界交错,跳出循环,返回答案原创 2024-05-28 11:11:10 · 186 阅读 · 0 评论 -
力扣Hot100-73矩阵置零(标记数组)
用矩阵的第一行和第一列代替方法一中的两个标记数组,以达到 O(1)的额外空间。在实际代码中,我们首先预处理出两个标记变量,接着使用其他行与列去处理第一行与第一列,然后反过来使用第一行与第一列去更新其他行与列,最后使用两个标记变量更新第一行与第一列即可。,(若第一行中存在零,则对应的这一列也要值为零,所以也会被标记,若第一行不存在零也不会导致影响第一行原本存在的值)。注意,在使用第一行和第一列记录其他位置是否存在值为零的元素时,若存在应该将第一行和第一列对应的值置为。的矩阵,如果一个元素为。原创 2024-05-24 15:07:53 · 441 阅读 · 0 评论 -
力扣Hot100-只出现过一次的数(技巧)
由于哈希表在查找目标数据元素的时间复杂度是O(1),所以考虑用哈希表判断当前元素出现过几次,出现过两次则将该元素丢弃。,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。原创 2024-05-20 16:15:49 · 161 阅读 · 0 评论 -
力扣Hot100-T10和为k的子数组(前缀和+哈希表)注意思路
使用前缀和+哈希表进行优化 (小红书社招二面出现过):(1)首先使用sum[i]统计i小标之前的所有数之和(包括下标i指向的数),因此某一段序列和为k转化为sum[p]-sum[q]=k,;有效解决负数带来的问题。在遍历过程中用value记录前i个数组值得总和,使用哈希表记录,其中sum[value]对应的值表示和为value的数组段。(2)遍历一遍sum,当前sum[p]已知,k已知,只要判断是否存在sum[q]=sum[p]-k,就能判断当前下标作为开始,是否存在一段数组之和等于k,出现次数ti原创 2024-05-12 23:28:15 · 208 阅读 · 0 评论 -
力扣Hot100-T7接雨水(动态规划,单调栈)
思路:根据图可以找到规律:当前指针指向下标t时,求t所能接到雨水的高度,由min(t左边最高,t右边最高)-height[t]所决定,eg:上面例子中下标t=2(下标从零开始),时左边最高为1,右边最高为3,所以所能接的雨水为min(1,3)-height[2]=1-0=1;对于后面的每一个下标t有RightMaxheight[t]=max(RightMaxheight[t+1],height[t]) (注意:因为是逆向,所以先知道t+1的右边最大高度,才能知道t的右边最大高度)原创 2024-05-10 14:12:40 · 349 阅读 · 0 评论 -
Hoot100-T6三数之和
经过上诉操作可以获得所有满足要求的序列,但由于三元组中排列顺序不重要,因此需要去除重复,将数组进行有序排列,当指针i或指针j指向的元素与上一个相同说明在上一轮已经判断过,直接跳过即可,有效避免重复判断(eg:-1,0,1,2,-1,-4 排列后为:-4,,0,1,2 其中(-1,0,1)是一个三元组,-1两次出现,当i指向第二个-1时由于其上一个也是-1,因此跳过对第二个-1的判断)不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。原创 2024-05-09 14:01:02 · 322 阅读 · 0 评论 -
力扣Hot100-T3最长连续序列()
正确思想:借用哈希表方便查找所需元素值value(将需要判断存在与否的元素Value作为哈希表的键,哈希表的值均为1表示当前元素存在),遍历一遍数组,指针i指向的数组元素value判断其是否是连续序列中的第一个(即value-1不存在),则忽略(eg:若当前value=9,若8存在则9不是连续序列的开头,忽略9继续遍历数组);对于超时的问题,添加判断,当前数字不是连续序列中的第一个时就跳过,同时要注意在第一个循环中要去重,判断哈希表中不存在当前nums[i]作为键时再插入。请你设计并实现时间复杂度为。原创 2024-05-08 17:21:59 · 254 阅读 · 0 评论 -
力扣hot100-T2字母异位词分组
思路:根据题目可以知道将“字母组成相同,顺序不同的字符串”分为一组,所以一组的字符串排序后的字符顺序必然相同(eg:"aacbd"和“badca”将字符串中字母元素排序后均为“aabcd”),所以使用哈希表,将排序后字符串(“aabcd”)作为键,对应的同为一组的所有字符串({"aacbd",“badca”})作为值.最终有几个键就有几个分组。是由重新排列源单词的所有字母得到的一个新单词。可以按任意顺序返回结果列表。给你一个字符串数组,请你将。原创 2024-05-06 10:35:26 · 175 阅读 · 0 评论 -
力扣hot100-T1两数之和
由于题目说数组中a+b的和是target,说明当前已知的任意值a,和target,另一个数必然为target-a,即b=target-a。在这里将所有数组存入哈希表中,nums中的元素值作为哈希表中的索引,nums中的索引作为哈希表中元素值。为解决上诉代码中的问题,此处选择将值存入哈希表的同时进行判断:由于要实现a+b=target需要保证a,b同时出现,因此在遇到第一个数a时可以先将a和a的数组下标存入哈希表,当遇到b时判断哈希表中有没有所需要的b,有则查找成功,没有则将b存入哈希表,继续往下遍历数组。原创 2024-05-03 14:30:02 · 397 阅读 · 0 评论