自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练Day62|LeetCode684-冗余连接、LeetCode685-冗余连接2

如图所示:节点A 和节点 B 不在同一个集合,那么就可以将两个 节点连在一起。

2024-07-09 09:52:05 1189

原创 代码随想录算法训练Day60|并查集理论基础、LeetCode1971-寻找图中是否存在路径

本篇我们讲解了并查集的背景、原理、两种优化方式(路径压缩,按秩合并),代码模板,常见误区,以及模拟过程。要知道并查集解决什么问题,在什么场景下我们要想到使用并查集。接下来进一步优化并查集的执行效率,重点介绍了路径压缩的方式,另一种方法:按秩合并,我们在 「拓展」中讲解。通过一步一步的原理讲解,最后给出并查集的模板,所有的并查集题目都在这个模板的基础上进行操作或者适当修改。但只给出模板还是不够的,针对大家学习并查集的常见误区,详细讲解了模板代码的细节。

2024-07-09 09:48:08 411

原创 代码随想录算法训练Day59|LeetCode127-单词接龙、LeetCode841-钥匙和房间、LeetCode463-岛屿的周长

如果我们是处理当前访问的节点,当前访问的节点如果是 true ,说明是访问过的节点,那就终止本层递归,如果不是true,我们就把它赋值为true,因为这是我们处理本层递归的节点。首先题目中并没有给出点与点之间的连线,而是要我们自己去连,条件是字符只能差一个,所以判断点与点之间的关系,要自己判断是不是差一个字符,如果差一个字符,那就是有链接。每个房间有不同的号码:0,1,2,…以示例1为例,从这个图中可以看出 hit 到 cog的路线,不止一条,有三条,一条是最短的长度为5,两条长度为6。

2024-07-06 21:17:15 743

原创 代码随想录算法训练Day58|LeetCode417-太平洋大西洋水流问题、LeetCode827-最大人工岛

这个过程的时间复杂度也为 n * n。所以整个解法的时间复杂度,为 n * n + n * n 也就是 n^2。

2024-07-06 21:15:05 1151

原创 代码随想录算法训练Day57|LeetCode200-岛屿数量、LeetCode695-岛屿的最大面积

给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。那么如果把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。

2024-07-06 21:09:48 790

原创 代码随想录算法训练Day56|DFS理论基础、LeetCode797-所有可能的路径、BFS理论基础

本题是比较基础的深度优先搜索模板题,这种有向图路径问题,最合适使用深搜,当然本题也可以使用广搜,但广搜相对来说就麻烦了一些,需要记录一下路径。而深搜和广搜都适合解决颜色类的问题,例如岛屿系列,其实都是 遍历+标记,所以使用哪种遍历都是可以的。至于广搜理论基础,我们在下一篇在好好讲解,敬请期待!BFS理论基础大家应该好奇,这一圈一圈的搜索过程是怎么做到的,是放在什么容器里,才能这样去遍历。很多网上的资料都是直接说用队列来实现。其实,我们仅仅需要一个容器,能保存我们要遍历过的元素就可以,

2024-07-06 21:04:33 865 1

原创 代码随想录算法训练Day55|LeetCode42-接雨水、LeetCode84-柱状图中最大的矩形

给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

2024-07-06 21:00:40 813

原创 代码随想录算法训练Day53|LeetCode739-每日温度、LeetCode496-下一个更大元素、LeetCode503-下一个更大元素2

题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。

2024-07-06 20:58:27 994

原创 代码随想录算法训练Day52|LeetCode647-回文子串、LeetCode516-最长回文子序列

力扣647-回文子串给你一个字符串 ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。示例 1:示例 2:解题思路动规五部曲:1.确定dp数组(dp table)以及下标的含义如果大家做了很多这种子序列相关的题目,在定义dp数组的时候 很自然就会想题目求什么,我们就如何定义dp数组。绝大多数题目确实是这样,不过本题如果我们定义,dp[i] 为 下标i结尾的字符串有 dp[i]个回文串的话,我们会发现很难找到递归

2024-07-06 20:51:09 974

原创 代码随想录算法训练Day51|LeetCode115-不同的子序列、LeetCode583-两个字符串的删除操作、LeetCode72-编辑距离

因为 dp[i] [j - 1] + 1 = dp[i - 1] [j - 1] + 2,所以递推公式可简化为:dp[i] [j] = min(dp[i - 1] [j] + 1, dp[i] [j - 1] + 1);这里可能不少录友有点迷糊,从字面上理解 就是 当 同时删word1[i - 1]和word2[j - 1],dp[i] [j-1] 本来就不考虑 word2[j - 1]了,那么我在删 word1[i - 1],是不是就达到两个元素都删除的效果,即 dp[i] [j-1] + 1。

2024-07-06 20:48:51 1032

原创 代码随想录算法训练Day50|LeetCode1143-最长公共子序列、LeetCode1035-不相交的线、LeetCode53-最大子数组和、LeetCode392-判断子序列

而是dp[6]。在回顾一下dp[i]的定义:包括下标i之前的最大连续子序列和为dp[i]。那么我们要找最大的连续子序列,就应该找每一个i为终点的连续最大子序列。所以在递推公式的时候,可以直接选出最大的dp[i]。

2024-07-06 17:16:31 633

原创 代码随想录算法训练Day49|LeetCode300-最长递增子序列、LeetCode674-最长连续递增子序列、LeetCode718-最长重复子数组

本题中,正确定义dp数组的含义十分重要。

2024-07-06 17:12:52 906

原创 代码随想录算法训练Day48|LeetCode188-买卖股票的最佳时机4、LeetCode309-最佳买卖股票时机含冷冻期、LeetCode714-买卖股票的最佳时机含手续费

给你一个整数数组prices和一个整数k,其中prices[i]是某支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成k笔交易。也就是说,你最多可以买k次,卖k次。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

2024-07-06 17:09:54 1088

原创 代码随想录算法训练Day46|LeetCode121-买卖股票的最佳时机、LeetCode122-买卖股票的最佳时机2、LeetCode123-买卖股票的最佳时机3

给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择买入这只股票,并选择在卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。

2024-07-06 17:02:57 676

原创 代码随想录算法训练Day45|LeetCode198-打家劫舍、LeetCode213-打家劫舍2、LeetCode337-打家劫舍3

打家劫舍是DP解决的经典题目,这道题也是打家劫舍入门级题目,后面我们还会变种方式来打劫的。

2024-07-06 16:48:05 646

原创 代码随想录算法训练Day44|LeetCode322-零钱兑换、LeetCode279-完全平方数、LeetCode139-单词拆分

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。

2024-07-06 16:44:20 710

原创 代码随想录算法训练Day43|完全背包理论基础、LeetCode518-零钱兑换2、LeetCode518-零钱兑换2

细心的同学可能发现,全文我说的都是对于纯完全背包问题,其for循环的先后循环是可以颠倒的!但如果题目稍稍有点变化,就会体现在遍历顺序上。如果问装满背包有几种方式的话?那么两个for循环的先后顺序就有很大区别了,而leetcode上的题目都是这种稍有变化的类型。这个区别,我将在后面讲解具体leetcode题目中给大家介绍,因为这块如果不结合具题目,单纯的介绍原理估计很多同学会越看越懵!别急,下一篇就是了!最后,

2024-07-06 16:39:45 1818

原创 代码随想录刷题复习day01

递归+for循环回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案。

2024-06-20 21:25:50 1210

原创 代码随想录算法训练Day42|LeetCode1049-最后一块石头的重量2、LeetCode494-目标和、LeetCode474-一和零

有一堆石头,用整数数组stones表示。其中stones[i]表示第i块石头的重量。每一回合,从中选出,然后将它们一起粉碎。假设石头的重量分别为x和y,且x <= y。x == yx!= yxyy-x最后,石头。返回此石头。如果没有石头剩下,就返回0。

2024-06-18 16:07:37 1098

原创 代码随想录算法训练Day41|01背包问题理论基础、01背包问题理论基础2、LeetCode416-分割等和子集

首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图:在看其他情况。状态转移方程 dp[i][j] = max(dp[i - 1] [j], dp[i - 1] [j - weight[i]] + value[i]);可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。dp[0] [j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。

2024-06-18 16:03:08 1956

原创 代码随想录算法训练Day39|LeetCode62-不同路径、LeetCode63-不同路径2、LeetCode343-整数拆分、LeetCode96-不同的二叉搜索树

确定遍历顺序,先来看看递归公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));

2024-06-16 15:47:53 731

原创 代码随想录算法训练Day38|动态规划理论基础、LeetCode509-斐波那契数、LeetCode70-爬楼梯、LeetCode746-使用最小花费爬楼梯

然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。

2024-06-16 15:43:31 955

原创 代码随想录算法训练Day37|LeetCode56-合并区间、LeetCode3738-单调递增的数字、LeetCode968-监控二叉树

以数组intervals表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

2024-06-16 15:39:05 828

原创 代码随想录算法训练Day36|LeetCode452-用最少数量的箭引爆气球、LeetCode435-无重叠区间、LeetCode763-划分字母区间、LeetCode37-解数独

此时问题就是要求非交叉区间的最大个数。这里记录非交叉区间的个数还是有技巧的,如图:区间,1,2,3,4,5,6都按照右边界排好序。当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢?就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。接下来就是找大于区间1结束位置的区间,是从区间4开始。

2024-06-16 15:35:30 716

原创 代码随想录算法训练Day35|LeetCode134-加油站、LeetCode135-分发糖果、LeetCode860-柠檬水找零、LeetCode406-根据身高重建队列

局部最优可推出全局最优,找不出反例,那就试试贪心。一些同学可能也会疑惑,你怎么知道局部最优就可以推出全局最优呢?有数学证明么?在贪心系列开篇词。

2024-06-16 15:31:18 1047

原创 代码随想录算法训练Day32|LeetCode122.买卖股票的最佳时机 II、LeetCode55-跳跃游戏、LeetCode45-跳跃游戏2、LeetCode1005-K次取反后最大化的数组和

局部最优推出全局最优,找不出反例,试试贪心!如图:i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。如果 cover 大于等于了终点下标,直接 return true 就可以了。关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。

2024-06-16 15:27:32 671

原创 代码随想录算法训练Day31|贪心算法理论基础、LeetCode455-分发饼干、LeetCode376-摆动序列、LeetCode53-最大子序和

所以这也是为什么很多同学通过(accept)了贪心的题目,但都不知道自己用了贪心算法,

2024-06-16 15:23:35 954

原创 代码随想录算法训练Day30|LeetCode51-N皇后、LeetCode37-解数独

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数n,返回所有不同的的解决方案。每一种解法包含一个不同的的棋子放置方案,该方案中'Q'和'.'分别代表了皇后和空位。可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。那么我们用皇后们的约束条件,来回溯搜索这棵树,

2024-06-16 15:16:49 558

原创 代码随想录算法训练Day29|LeetCode491-非递减子序列、LeetCode46-全排列、LeetCode47-全排列2

给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中。你可以按返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

2024-06-05 19:22:22 514

原创 代码随想录算法训练Day28|LeetCode93-复原IP地址、LeetCode78-子集问题、LeetCode90-子集2

正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。给定一个只包含数字的字符串s,用以表示一个 IP 地址,返回所有可能的,这些地址可以通过在s中插入'.'来形成。你重新排序或删除s中的任何数字。你可以按顺序返回答案。``s` 仅由数字组成。

2024-06-03 19:45:53 973

原创 代码随想录算法训练Day27|LeetCode39-组合总和、LeetCode40-组合总和2、LeetCode131-分割回文串

给你一个的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的 所有,并以列表形式返回。你可以按返回这些组合。candidates中的数字可以。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为target的不同组合数少于150个。

2024-06-03 10:10:18 741

原创 代码随想录算法训练Day25|LeetCode216-组合总和3、LeetCode17-电话号码的字母组合

找出所有相加之和为n的k返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

2024-06-03 10:03:11 336

原创 代码随想录算法训练Day24|回溯理论基础、LeetCode77-组合

回溯基本介绍回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案抽象成一种图形结构,所有的回溯法都可以抽象成一个树形结构(N叉树 )回溯算法通过递归来控制有多少层for循环,递归里的每一层就是一个for循环。

2024-06-03 09:58:19 457

原创 代码随想录算法训练Day23|LeetCode669-修剪二叉搜索树、LeetCode108-将有序数组转换为二叉搜索树、LeetCode4538-把二叉搜索树转换为累加树

给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。(即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。[1, 104]

2024-05-29 16:01:17 1111

原创 代码随想录算法训练Day22|LeetCode235-二叉搜索树的最近公共祖先、LeetCode701-二叉搜索树中的插入操作、LeetCode450-删除二叉搜索树中的节点

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

2024-05-29 13:33:03 815

原创 代码随想录算法训练Day21|LeetCode530-二叉搜索树的最小绝对差、LeetCode501-二叉搜索树中的众数、LeetCode236- 二叉树的最近公共祖先

力扣530-二叉搜索树的最小绝对差给你一个二叉搜索树的根节点 ,返回 树中任意两不同节点值之间的最小差值 。差值是一个正数,其数值等于两值之差的绝对值。示例 1:示例 2:提示:树中节点的数目范围是 题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值。注意是二叉搜索树,二叉搜索树可是有序的。遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了递归其实在二叉搜素树中序遍历的过程中,我们就可以直接计算了。需要用一个pre节点记录一下cur节点的前一个

2024-05-29 09:59:10 992

原创 代码随想录算法训练Day20|LeetCode654-最大二叉树、LeetCode617-合并二叉树、LeetCode707-二叉搜索树中的搜索、LeetCode98-验证二叉搜索树

题目描述给定一个的整数数组nums。可以用下面的算法从numsnums返回nums 构建的。

2024-05-28 19:25:36 902

原创 代码随想录算法训练Day18|LeetCode513-找树左下角的值、LeetCode112-路径总和、LeetCode113-路径总和2、LeetCode106-从中序与后序遍历序列构造二叉树

如果使用递归法,如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行所以要找。

2024-05-28 13:09:37 684

原创 代码随想录算法训练Day17|LeetCode110-平衡二叉树、LeetCode257-二叉树的所有路径、LeetCode404左叶子之和

给定一个二叉树,判断它是否是 平衡二叉树树中的节点数在范围[0, 5000]内。

2024-05-27 20:04:49 827

原创 代码随想录算法训练Day16|LeetCode1104-二叉树的最大深度、LeetCode111-二叉树的最小深度、LeetCode222-完全二叉树的节点个数

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。

2024-05-27 15:50:02 1091

空空如也

空空如也

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

TA关注的人

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