自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 力扣刷题记录(29)LeetCode:695、1020、130

这道题和计算岛屿周长类似,在这里dfs的功能就是由一块陆地出发,找出这块陆地所在的岛屿并返回岛屿面积。

2024-01-07 16:08:07 652 1

原创 力扣刷题记录(28)LeetCode:797、200、463

图论题目主要是运用两种方法,深度优先遍历、广度优先遍历,本文章的三道题所用的均是深度优先遍历。

2024-01-06 15:29:17 741

原创 力扣刷题记录(27)LeetCode:503、42、84

用一个栈来单调递增地存储已经遍历过的元素,如果遇到当前元素大于栈顶元素,而栈顶元素的下一个元素肯定是不小于栈顶元素的,那么当前元素、栈顶元素及栈顶元素的下一个元素这三个元素就可以存储到水。如果我们可以找到当前柱子左边第一个比它低的i和右边第一个比它低的j,那么i、j中间柱子的高度一定大于等于当前柱子。需要注意的是对于最后一个元素我们不肯找出右边比它还小的元素了,因为右边已经没有元素了。同时对于最小的那个元素,我们也无法找到左边或者右边比它还小的元素了,因为它已经是最小的那个元素了。

2024-01-06 10:36:39 543

原创 力扣刷题记录(26)LeetCode:516、739、496

用dp[i][j]表示区间[j,i]内最长回文子序列的长度,j从i位置开始向前遍历。1.当i==j时,dp[i][j]=12.当s[i]==s[j]时,dp[i][j]=dp[i-1][j+1]+23.当s[i]!=s[j]时,dp[i][j]=max(dp[i-1][j] , dp[i][j+1])

2024-01-04 15:45:34 549

原创 力扣刷题记录(25)LeetCode:583、72、647

题目说可以删除任意一个字符串中的字符,实际上就是在求两个字符串的公共子序列。求得公共子序列后与字符串长度做个减法即可得需要的步数。

2024-01-03 14:07:22 555

原创 力扣刷题记录(24)LeetCode:53、392、115

子数组、子序列问题都是分两种情况。当前字符相等、当前字符不相等。

2024-01-02 23:44:33 866

原创 力扣刷题记录(23)LeetCode:718、1143、1035

动态规划的本质就是当前结果依赖于之前的结果。

2023-12-31 16:05:03 515

原创 力扣刷题记录(22)LeetCode:714、300、674

直接分析状态:1.持有股票2.不持有股票。

2023-12-30 15:09:33 767

原创 力扣刷题记录(21)LeetCode:121、123、188、309

如果某一天出售股票可以得到最大利润,那么股票买入的价格一定是这天之前股票的最低价格。所以我们可以在遍历股票价格的时候不断更新股票的最低价格,然后尝试在今天卖出,不断取能够卖出的最大利润。

2023-12-29 14:26:34 598

原创 力扣刷题记录(20)LeetCode:198、213、337

需采用后续遍历,因为我们要知道当前结点的子树所取最高金额的情况。索引为2时,就要看前两个索引[0,1]的状态了,如果索引0被取,那么当前值就可取;所以索引2可得的最高金额为max(dp[2-1],dp[2-2]+nums[i])往下推就可以发现当前索引可以拿到的最高金额与前两个索引的状态有关,得递推公式dp[i]=max(dp[i-1],dp[i-2]+nums[i])索引为1时,可以拿到的最高金额就是在索引[0,1]之间取,为2。dp[i]:i表示索引,dp表示当前索引可以拿到的最高金额。

2023-12-27 17:12:29 688

原创 力扣刷题记录(19)LeetCode:279、139

这题要想到截取区间,如果区间前的单词可以由wordDict中的单词构成,并且区间中的单词也可以在wordDict中查找到,那么当前索引前的单词就可由wordDict中的单词构成。对单词的顺序有要求,所以要先遍历背包后遍历物品。dp表示该索引前的单词是否可以由wordDict中的单词构成,下标代表索引。这题和上篇文章的题类似,直接上代码。

2023-12-26 22:21:50 607 1

原创 力扣刷题记录(18)LeetCode:474、518、377、322

01背包问题和完全背包问题的主要区别是元素是否可以无限制取。在解决问题的方式上,如果是求组合就先遍历物品再遍历背包容积,如果是求排列就先遍历背包容积再遍历物品。

2023-12-25 14:59:40 622 1

原创 力扣刷题记录(17)LeetCode:416、1049

可以把石头尽可能地分成两等份,这样可以使两份石头相撞时等到最小的石头。这样的话问题就变成了01背包问题,背包的容量为总石头的一半。需要注意的是在遍历背包容积时还是要采用倒序遍历,目的是每个避免重复取某一块石头。先正序遍历nums数值,再倒序遍历背包容量。因为如果正序遍历可能会出现重复取值的情况,而在本题nums中的每个值只能取一次。背包的容量就是nums数组和的一半。对于nums的各个元素我们有取和不取两种选择,我们取这两种方案中较大的值。索引i表示背包的容量,dp[i]表示当前容量能够装载的最大值。

2023-12-20 18:31:27 612

原创 力扣刷题记录(16)LeetCode:62、63、343、96

动态规划的难点在于如何才能找到动态转移方程。动态规划是解决由重复子问题所构成的大问题。所以要从题目中提取出这个重复的子问题是什么。

2023-12-19 14:11:18 783 1

原创 力扣刷题记录(15)LeetCode:509、70、746

通过这些简单题来了解动态规划的思想、解题思路、解题步骤。这些题有一个共通的特性,就是如果想要得到当前答案,必须由上面所给出的答案推导而来。确定dp数组以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组。

2023-12-18 12:29:37 572 1

原创 力扣刷题记录(14)LeetCode:763、56、738

贪心算法可以解决两类问题,一类是寻找最大值问题(跳跃游戏、买股票的最佳时机、最大子序列和等),另一类是区间问题(引爆气球、无重叠区间、合并区间等)。其实寻找最大值也是在一段区间中寻找,归根结底还是区间问题。只不过一些问题是在区间里面寻找最大值,一些问题是判断区间是否重叠。

2023-12-17 14:14:57 580 1

原创 力扣刷题记录(13)LeetCode:406、452、435

题目说有一个people数组,people的元素也是一个数组,里面包含h和k,h表示人的身高,k表示前面有k个人的身高高于自己。现在要就你根据h、k这两个维度对people进行重新排序。和上一篇文章的135.分发糖果问题一样,要同时考虑两个维度。分发糖果是一个维度一个维度地去解决的,正反两次遍历。这道题也一样,先按身高从大到小排序,再确定每个人前面比他高的人的人数。

2023-12-15 18:05:10 557

原创 力扣刷题记录(12)LeetCode:45、1005、135、860

1005、860这两天都是常规的思路,正常推理就可以找到解决方法,关键点在于细节的实现。要分类讨论,针对不同的结果提供不同的解决方式。45题是比较典型的贪心算法思维,重点在于如何去定位局部、如何去找局部最优解。跳跃游戏II比上一篇文章中的跳跃游戏要难一些。跳跃游戏局部:当前所在的格子能够到达的最远距离局部最优:接收已经遍历过的格子所能达到最远距离,也就是提取每个格子能够到达的最远距离集合的最大值。跳跃游戏II局部:当前格子所能到达的范围内,下一步能够到达的距离。

2023-12-14 15:02:00 519 1

原创 力扣刷题记录(11)LeetCode:455、376、53、122、55

以上题目都是利用贪心算法根据题目规则来提取最大值的过程,在遍历过程中不断收集最大值。最大值产生于局部最优之中,有可能是局部最优之和(122题),也有可能是局部最优之中的最大值(53、55题)。总之利用贪心算法求解问题的关键步骤就是寻找局部最优,然后再根据道题的具体要求进行一系列的操作。

2023-12-13 13:24:37 463 1

原创 力扣刷题记录(10)LeetCode:51、37

应为各个皇后之间不能同行,所以一行只能有一个皇后。我们可以遍历每一行的各个位置,判断该位置是否可以放置皇后,一行放置一个。当一个皇后的位置已经在这一行确定了,我们就可以遍历下一行来确定下一个皇后在下一行的位置,是不是像是在不同集合里各取一个数。和17.电话号码的字母组合 类似,只不过这题在取值的时候是有条件的。在不同集合间取值是不需要startIndex(开始位置)的。然后在该位置处遍历1-9,判断合适的数字。遇到合适的数字后就将其写入board中,然后利用递归再对下一个空白处进行值的确定。

2023-12-12 23:48:23 530 1

原创 力扣刷题记录(9)LeetCode:79、90、491、46、47

需要同层去重,如果我们可以记录同一层中哪些元素已经使用过了,然后再遍历新的元素时查看该元素的值是否被使用过。但是在这道题中对路径path没有任何限制,只需要我们在取出一个值后,将值输入result中,再从剩余元素中取一值,不断递归回溯。相较于上一题,这题多了一步去重的操作。我们可以在排序后直接用used进行同层去重,和之前的题目一样,如果前一个元素的used值为false,说明两个元素处于同层。比较简单的思路就是当取出一个元素后,我们就将这个元素移除,然后再剩余的元素中再取值,直到没有剩余的元素了。

2023-12-11 14:16:39 887 1

原创 力扣刷题记录(8)LeetCode:40、131、93

去重的操作就是保证同层的结点的值不能重复,但是在保证每个元素只取一次的前提下同一个路径(从根节点到某一叶子结点)的元素是可以重复的。这点不好理解,我们可以看看上图,如果我第一个值取1,第二个值取了2,这时2的前一个值1对应的是false,1和2同层。切割逻辑:从字符串起始位置开始切割,如果切割出的子串是回文串就将它放入路径中,如果切割出的子串不是回文串,我们就循环到下一个位置继续切割,直到找出回文子串将它放到路径中。这道题和上一题差不多,需要解决的问题就是寻找切割点,判断切割出来的数字是否有效。

2023-12-09 15:31:06 1056

原创 力扣刷题记录(7)LeetCode:77、216、17、39

第一层循环的次数就是digits的长度,因为我们要到每个数字对应的字母串中取出一个字母,其实也就是递归的深度。比如当n=4,k=3时,只有i等于1或2时存在符合条件的组合,当i等于3或4时,剩余的集合数量小于k,就一定没有符合条件的。我们可以遍历[1,n]中的每一个值,当我们在[1,n]中取了一个值时,我们就利用递归从剩下的集合中再取一个值,反复进行递归操作直到取到的值的数量等于k,然后向上回溯。就是取了数字对应的字母串中的一个字母后,递归到下一个数字,再从数字对应的字母串中取一个字母。

2023-12-08 16:03:45 1128

原创 力扣刷题记录(6)LeetCode:669、108、538

450这道题需要考虑删除结点的左右子树都不为空的情况,但这道题不用,它只需要返回删除结点左右子树的其中一个即可。如果该结点大于right,那么该结点的右子树一定都大于high,只需要再次递归处理左子树。这道题需要找到二叉搜索树的累加规律,如果采用右中左的遍历方式,那么当前结点的值就等于自己本身的值+前一个结点的值。所以我们需要采用右中左的遍历方式,并且记录上一个结点的值。这题比较简单,只需要取nums中的中间值作为根节点,然后以根节点为界限分割左右子树,最后维护左右子树的nums即可。

2023-12-07 13:55:11 491 1

原创 力扣刷题记录(5)LeetCode:235、701、450

起初想用中序遍历,然后找到第一个大于val的结点,找到该结点后将val放到该结点的左边。那么我们就只需要根据当前结点与val的大小关系来遍历到叶子结点,再将val插入即可。如果某一个结点的值在p、q之间,那么这个结点一定是p、q的最近公共祖先。5.结点的左右孩子都不为空:找到右子树最左边的结点,将该节点的左指针指向左子树。3.结点的左孩子为空,右孩子不为空:该结点的父节点直接指向右孩子。4.结点的左孩子不为空,右孩子为空:该结点的父节点直接指向左孩子。2. 结点的左右孩子为空:直接释放该结点。

2023-12-06 18:04:51 515 1

原创 力扣刷题记录(4):LeetCode:530、501、236

在上一篇文章中的 98. 验证二叉搜索树 这道题中提到了二叉搜索树的一个特性,就是二叉搜索树的中序遍历是递增的。那么我们就可声明一个变量来存储相邻结点的差值(绝对值),然后不断维护这个差值。这里我们也还需要声明一个变量来保存当前结点的前一个值。这道题最简单的方法就是用哈希表,遍历一遍整棵树,在哈希表中统计各个值出现的频率。这种方法比较简单,这里用开销更小一些的中序遍历。还是利用二叉搜索树的特性,我们只需要取维护最大频率、当前频率和前一个值即可。

2023-12-05 23:52:30 452

原创 力扣刷题记录(3)LeetCode:654、617、98

维护集合nums:将根节点在nums中左侧的集合赋值给根节点左子树的nums,将根节点在nums中右侧的集合赋值给根节点右子树的nums。这里要理解什么是二叉搜索树,简单来说就是当前结点左子树的每一个值都比当前结点小 ,当前结点右子树的每一个值都比当前结点大。这里我们很容易就可以判断该结点的值与左右孩子结点的值的大小情况,但是我们很难去判断该结点的值是否大于或小于它的左右子树的每一个值。可以声明一个变量来存储当前结点的上一个结点的值,比较当前结点和变量的大小,然后不断维护变量的值。

2023-12-04 17:35:23 640

原创 力扣刷题记录(2)LeetCode:404、513、112、106

维护后序遍历集合(postorder)就是根据左子树的中序遍历集合(inorder)的大小size,在根节点的后序遍历集合(postorder)中从左到右取size个元素给左子树的后序遍历集合(postorder),其余归右子树的后序遍历集合(postorder)。如果确定了这棵树的根节点(root),那么根据根节点(root)的中序遍历集合(inorder)就可以将其分成两个集合,分别表示根节点(root)的左子树中序遍历集合(inorder)和根节点(root)的右子树中序遍历集合(inorder)。

2023-12-02 14:48:28 963

原创 力扣刷题记录(1)LeetCode:226、110、257

这里要注意是每个结点的左右子树的高度差不超过1,这就需要我们对每个结点都要进行一个相同的操作,那肯定就是要遍历每个结点了。至于当前结点root的高度,我们只需要取root的左右子树中较大的高度再+1就是当前结点的高度了。拿实例一来看,我们将2的子节点交换玩之后(先左)就是交换4的子节点了(再中),4交换完就该右节点了(再右)。这是问题就来了,4的右节点还是2,这就造成2的子节点变换了两次,7的子节点没有交换。每遍历一个结点就将该结点放进一个容器中,当返回上一个结点时就将当前的节点从容器中移除。

2023-12-01 16:25:30 476

原创 C# 核心

如果0代内存满了,将会触发GC(内存回收机制),它会遍历0代内存,将没有索引的空间释放掉,然后将余下的数据迁移到1代内存中。如果1代内存满了,也会触发GC,它会遍历0代内存及1代内存,将无用的空间释放掉。如果2代内存满了,也会触发GC,它会遍历0代内存、1代内存以及2代内存,将无用的空间释放掉。接口不能继承类,一般接口都是被类继承。objB),如果是值类型判断两者数据是否相等(微软在值类型的基类System.ValueType中重写了该方法,用来比较值相等),如果是引用类型判断两者是否引用同一块内存。

2023-11-01 17:13:56 111

空空如也

空空如也

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

TA关注的人

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