自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录训练营Day44 动态规划part06● 完全背包● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

假如nums[0]=1,nums[1]=5,那么“外层for循环遍历物品,内层for遍历背包”也可以理解为先固定一个物品,不断扩大背包容量,进一步理解,外层的物品就相当于你爬楼梯,此时已经站在的第n阶台阶上,j相当于你要到达的终点,dp[j]一定包括了你站在n阶上再行动这种情况,而dp[j]的值就是我站在任意阶台阶上再行动的情况。我们发现,当先固定了背包的容量后,我们会把1和5都遍历一遍,包含了{1, 5} 和 {5, 1}两种情况。既然是求排列数,上面有将到,求排列数,就需要先遍历背包再遍历物品了。

2023-06-23 11:32:03 255

原创 代码随想录训练营Day42 动态规划 part05● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

通过递归公式可知,j永远与j-nums[i]有关,dp[0]是在公式中一切递推结果的起源,背包为0填满需要几种方法,答案是一种,因为没有方法也是一种方法。所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);dp[i][j] 可以由前一个strs里的字符串推导出来,strs里的字符串有zeroNum个0,oneNum个1。dp[i][j] 就可以是 dp[i - zeroNum][j - oneNum] + 1。

2023-06-23 00:37:01 228

原创 代码随想录训练营Day41 动态规划part04● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

一维数组,在遍历顺序上有小坑,当我们从前往后遍历时,假如我更新了dp[1],然后想要更新dp[2]时,结果dp[2]与上一层的dp[1]有关,而dp[1]已经被更新了,那么得出的dp[2]就是不准确的.所以只能从后往前遍历。既然dp[i][j]可以由dp[i-1][j]和dp[i-1][j-weight[i]]来表示,那代表二维数组的每一层都可以由它的上一层求出来,那么就是一维数组的变换。如果装物品i,那么dp[i][j]就等于dp[i-1][j-weight[i]]+value[i]。

2023-06-20 23:21:16 258

原创 代码随想录训练营Day40 动态规划part03● 343. 整数拆分 ● 96.不同的二叉搜索树

它的右子树上的值一定比他大,那么它的右子树就可以看作是由它大的节点组成的二叉树,比他大的节点个数是i-j,所以数量是dp[i-j],所以由j为头结点就会形成dp[j-1]*dp[i-j]种二叉树。首先,如果是n为3的话,那么头结点就可以为1,2,3,因此,如果为n,头结点就有n个,分别为1-n,,这就要求我们再用一个j循环,来记录每个头结点可以形成的二叉树的数量。所以我们每次对j遍历时,都需要找到i*(i-j)和i*dp[i-j]中的最大值,然后和上一次j循环中的dp[i]比较,更新dp[i]的值。

2023-06-19 09:39:41 186

原创 代码随想录训练营Day39 动态规划part02● 62.不同路径 ● 63. 不同路径 II

我们求(0,0)到(i,j)的路径数量,由于只能往下或者往右移动,所以我一定会经过(i-1,j)或者(i,j-1),而当我经过(i-1,j)或者(i,j-1)只要再走一步就可以到达(i,j),所以求(0,0)到(i,j)的路径数量就可以转化为求(0,0)到(i-1,j)路径数量与(0,0)到( i,j-1)路径数量的和。这道题,我们要求得是(0,0)到(i,j)的路径数量,那我们就干脆用dp数组记录数量,dp[i][j]就代表从(0,0)到(i,j)的路径数量。耗时1.5小时,稍微有点感觉了,再接再厉。

2023-06-17 10:31:09 132

原创 代码随想录训练营Day38 动态规划part01 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

我一开始想的是,由于我一步可以走一阶或者两阶,所以如果想知道i阶楼梯的方法个数dp[i],就需要知道dp[i-1]和dp[i-2],dp[i-2]想到dp[i],可以走两步1阶,也可以一步2阶,所以我就误推成。我们想知道某一层状态产生的值,就一定要知道它的前个状态产生的值,想知道dp[i]就要知道dp[i-1]和dp[i-2],所以这道题肯定是从前往后遍历。想知道i阶楼梯的方法个数dp[i],就需要知道dp[i-1]和dp[i-2],dp[i-2],所以我们需要最初始的状态,dp[1]和dp[2].

2023-06-16 18:51:24 141

原创 代码随想录训练营Day37 贪心算法 part06 ● 738.单调递增的数字 ● 总结

我们可以从后往前看。4比第二个5小,如果要递增,个位上的数字一定要比十位上的大,又要最大,所以个位上的数字用最大的9,十位上减1就可以了。所以就变成了549.其实贪心算法没啥套路也没规律,主要就是从小部分去贪,再看这个小部分贪的技巧能不能适用于全部。贪心算法就出来了,从后往前遍历,只要比前面一位小,就变为9.这道题第一眼其实思路不好找。我们找一个数字分析一下。554它的单调递增的最大数字是499.怎么来的呢?再比较十位和百位,同理,就变成了499了。Day37 耗时1.5小时.

2023-06-15 16:37:10 115

原创 代码随想录训练营Day36 贪心算法 part05● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

这道题也是重叠问题,合并区间也需要先找到重叠的区间,然后只要把右边界更新为原来右边界和重叠的右边界中大的那个就可以了。同一字母只能出现在一个片段中,所以我们首先要找到每个字母在片段中出现的最终下标。然后通过循环遍历,更新自己的右边界。其他字母的下标如果比前面一个小,就不变,如果大,就扩大右边界right。这道题返回 需要移除区间的最小数量 ,那么我们只需要找到重叠区间的个数就可以了。与Day35打气球那道题一样,这道题也需要先排序。此时前面出现过所有字母,最远也就到这个边界了。这道题其实也是一道重叠问题。

2023-06-14 22:19:57 175

原创 代码随想录训练营Day35 贪心算法 part04● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

假如客户给的是20元,那有两种找零方式,第一种找1张10元,1张5元,第二种找3张5元。我们优先进行第一种找零方式,因为5元钞票找10元时也用的到,比10元钞票更万能通用。来判断,如果上一个的右区间大于这个的左区间,那肯定就有重叠部分,然后更新重叠气球的最小有边界,只要这个最小右边界在下一个气球左边界的右侧说明依旧重叠......例如:实例1中的[[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]排序之后为[[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]。

2023-06-13 18:34:39 190

原创 代码随想录训练营Day34 贪心算法 part03● 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果

如果第一个元素满足,结果由于累加第三个元素的cursum反而小于0了,说明,第一个加油站我得到的油是大于我消耗的油的,为什么不把第二个加油站作为起始位置,因为即使加上第一个加油站剩余的油,我都开不完,更别提把第一个加油站剩余的油删去的情况了。这道题比较困难,因为条件中——相邻两个孩子评分更高的孩子会获得更高的糖果,而除了两端,中间的元素都会有一左一右两个相邻元素,所以我们需要分别考虑他们的左元素和右元素。做这道题,我们首先需要知道,只要 gas的和大于cost的和,一定就能走完。

2023-06-12 13:08:48 162

原创 代码随想录训练营Day32 贪心算法 part02● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

让我们举个例子比如prices=[1,5,3,6],首先不用算法,就靠常识,想要利润最大,我会选择第一天买,第二天卖出,第三天买,第四天卖出。这道题比较有意思,首先我们要明确每个元素代表在该位置可以跳跃的最大长度,假如这个最大长度为a,则意味着这个元素后面a个元素都可以跳跃到。所以我们就把这个问题由一个定点问题转化为了范围问题,只要最大范围大于nums.size()-1,代表一定能跳到最后一个下标。那我们就需要限定每一次跳跃时能达到的最长距离,到达了最大范围的边界后,再用过程中记录的最大距离更新这个边界。

2023-06-10 18:28:42 154

原创 代码随想录训练营Day31 贪心算法 part01● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

如何尽可能用有限的饼干喂给更多的孩子,首先我们思考,一块最大的饼干能喂给任何人,那喂给饭量大的小孩划算还是饭量小的小孩划算,那自然是喂给饭量大的,因为假如最大的喂给了饭量小的,那么第二大的饼干不一定就能满足饭量大的小孩,而反过来,大饼干给大孩子,小饼干也又可能能满足小孩子的需求。而如果前面一段数的和是正数,那么加上a后,一定也比a大,就留着。Day31打卡成功,第一次接触贪心算法,发现这是一个很灵活的,根据题目的特性而找到最优解的算法,没有固定套路,了解了思路很简单,最难的就是找到该怎么去贪,慢慢琢磨吧!

2023-06-09 22:33:35 178

原创 代码随想录训练营Day30 对回溯算法的总结

又例如全排列进行树枝去重时,需要构建一个bool数组used来判断元素是否使用过,也不会自动撤回,所以需要重新令used[nums[i]]==false,说明它没有被使用过。从代码中我们看出,想要返回上一层结构,要么通过if(终止条件) return,要么就是全部遍历结束自动返回到上一层递归函数代码backtracking()中。组合、排列问题中,都需要构造一个path数组来记录路径,而我如果返回到上一层,数组中的元素不会自动撤回,所以需要path.pop_back()来人工删除。

2023-06-09 20:16:30 82

原创 代码随想录训练营Day29 回溯算法part05* 491.递增子序列* 46.全排列* 47.全排列 II

排列题是回溯算法中的经典例题了,首先排列和组合的区别在于,排列中元素的顺序不同,组成的数组就不同,而组合 就算1种,举个例子[1,2,3]和[1,3,2]是不同的排列,却是相同的组合。首先确认回溯的返回值和参数,返回值就是void,而由于每一次递归,深层遍历都要避免遍历重复的元素,所以参数中除了nums数组外,还要有一个bool类型的数组进行去重。接着就是确认回溯的终止条件了,很明显,全排列中,当path中的元素个数和原来数组中元素个数相同就意味着排列结束,即终止,将path存入result。

2023-06-08 20:53:32 162

原创 代码随想录训练营Day28 第七章 回溯算法 ● 93.复原IP地址 ● 78.子集 ● 90.子集II

这道题在我们做了这么多回溯题值后,还是比较easy的。找到所有的子集,包括空集和本身,甚至连终止条件都不需要。Day28打卡成功,耗时3.5小时,对去重操作进行巩固,并对回溯算法有了更深刻的理解,再接再厉!2.相同元素的只遍历一次,剩下的都跳过。只需要在每一次回溯的过程时把元素存进path,再将path存进result就好。这道题与上一题的区别在于这道题集合中可能包含重复元素,所以需要采用去重操作。除此之外,就是需要自定义一个函数,来确定是否是有效字符串,需要满足几个条件。3.不可以出现0-9以外的字符。

2023-06-07 22:30:45 162

原创 代码随想录训练营 Day27 回溯算法part03 39. 组合总和● 40.组合总和II● 131.分割回文串

接着是如何分割字符串。这一点其实和组合题很像,分割线就是每一次,backtracking中的index,我们通过for循环找到回文子串,然后将之输入进path中。这道题与之前两道组合题的区别在于这道题并没有限制数字的个数,所以这道题并不能确定构成的树的深度。Day26打卡成功,耗时3小时,去重和分割的方法很有意思,一知半解,再接再厉!这道题略难,第一次接触,确实有一些吃力,在此分享一些自己的想法。首先就是判断回文串,可以采用双指针法。按图理解可能容易一些(代码随想录)这道题又有了新的条件——

2023-06-06 20:52:28 151

原创 代码随想录训练营Day25 回溯算法part02 216.组合总和III● 17.电话号码的字母组合

和Day24的组合题一样,当path.size()==k时return,但如果想要让result记录,不是每一个path都够格的,需要再使用一个if(sum==targetsum)记录,满足条件的再result.push_back(path)。我们需要一个参数来确定组合数字的个数(k),一个参数记录数字之和(targetsum),一个参数记录递归过程中的数字之和(sum),当然还需要一个startindex实现函数的逐步递归。我个人理解,回溯是一个递归不断深入再返回的过程,而sum不会跟着返回,所以要么。

2023-06-05 20:02:33 167

原创 代码随想录训练营Day24 回溯算法part01 理论基础 ● 77. 组合

因为回溯算法可以通过树形结构来表示,所以我们就可以通过for循环数组来决定树的宽度(很幸便利),用递归来决定树的深度(纵向遍历)。什么时候停止回溯,自然是深度已经到k的时候,也就是数组中已经有k个值的时候。我们可以看出,我们需要一个参数来决定树的宽度,一个参数来决定数的深度,但如果需要递归进行下去,还需要一个参数来定位。这道题最后要return的是一个二维数组,如果我们把二维数组定义为全局变量,那么函数就不需要有返回值了,那么就是void。这道题是一道很经典的回溯例题,同递归一样,回溯也有着自己的三部曲。

2023-06-04 21:42:37 135

原创 代码随想录训练营Day 23 二叉树part09 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇

这道题的本质,其实就是找不在范围内的节点,找到后寻找它的子树中满足范围的节点,并将该节点返回给不在范围内的节点的上一层节点(横刀夺爱,将该不在范围内的节点扔掉)。其实这样的代码还是有漏洞的,不满足的节点依旧存在,需要delete处理。由于是一个二叉搜索树,所以如果递归找到一个val<low,那么它的左子树一定都是小于low的,右子树一定大于val。比较新奇的是,这次的递归顺序是 右中左,因为最右边的数字是最大的,所以我们依次从右边开始处理。而由于这个序列已经是升序的了,根节点就选择序列的中间数。

2023-06-01 21:02:35 155

原创 代码随想录训练营Day22 二叉树part08 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

那么这道题思路就很简单了,就通过递归比较,root->val和value值的大小,如果root->val大于value,那么就递归到root的左节点,如果root->val小于value,那么久递归到root的有节点。所以只要我们通过前序递归,找到第一个在p和q之间的节点,假如p<q,它就代表着它的左子树上一定有一个节点p,右字数上一定有一个节点q,它就一定是最近的公共祖先,我如果往左边继续递归,会错过q,往右边递归,就会错过p。第二种情况:找得到节点,且是叶子节点,第五种情况:找得到节点,左右孩子都有。

2023-05-31 21:03:07 146

原创 代码随想录训练营Day21 二叉树part07 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先

当然,我们也可以靠二叉搜索树的性质——父节点和它的左右子节点可能相等,所以我们也可以使用双指针法,如上题,pre记录上一个节点,root记录当前节点,只要相等那么count++,并把元素放进result数组中,如果不相等,就重置count,继续递归,并用maxcount记录递归过程中最大的count,如果出现更大的count就清空result,放入新的元素。我们可以将二叉树通过中序递归组成一个数组,由于二叉搜索树的性质,这是一个递增的数组,然后只要通过一次遍历,就能找到两个数的最小差值了。

2023-05-31 18:10:38 137

原创 代码随想录训练营Day20 二叉树 part06 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

这道题主要考察的就是搜索二叉树的性质,通过定义,我们可以了解,如示例一,左子节点的数值<父节点的数值<右子节点的数值。我觉得这道题主要考了二叉搜索树的性质,一个父节点,它的左子节点一定比父节点小,右子节点一定比父节点大,所以我们就不用无脑遍历了,可以进行一定的剪枝处理。最大二叉树构造逻辑就是先找到数组中的最大值为父节点a,这个元素a左边的元素构成一个新的数组,找到最大值即为a的左节点b,a右边的元素也构成一个新的数组,找到最大值即为a的右节点c。构建二叉树,返回的自然就是二叉树的节点了。

2023-05-30 20:33:07 117

原创 代码随想录Day18 二叉树 part05 513.找树左下角的值● 112. 路径总和 113.路径总和ii● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

这道题我的第一想法就是通过递归和回溯,将每一个路径的元素之和求出来,放进map里,再从map里查找targetsum,如果有,就return true,否则,return false。这道题我的第一想法是一直递归到最左边的值,但是有个问题,题目限制了条件,不仅要最左边,还需要最底层。首先后序列(左右中)的最后一个元素一定是根节点,然后在中序列中找到该元素,该元素的左边及根节点的左孩子,右边及右孩子,而由于“左孩子”“右孩子”也可以作为各自的根节点,继续向下延申,所以递归的思路就出来了。

2023-05-27 20:34:12 199

原创 代码随想录训练营Day17 二叉树part04 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

如何判定平衡二叉树呢。本题思路为,通过前序递归,首先插入节点元素,递归期间将路过的节点值插入到数组path中,一直递归到叶子节点,并将这个完整路径赋值给另一个数组result,再通过path的push和pop改变路径。我们如果通过递归,直接到叶子节点处,我们无法区分左右,所以我们就递归到叶子结点的上一层,这样可以通过root->left找到左节点。回溯的作用是,能将将回到递归前的位置。这道题,我的第一想法是,找到最后一层的奇数位置的元素,就是左叶子节点,但是很快就被我否定了,这个想法只能用于完全二叉树。

2023-05-26 22:57:02 146

原创 代码随想录训练营Day16 二叉树part03 104.二叉树的最大深度 111.二叉树的最小深度● 222.完全二叉树的节点个数

二叉树!

2023-05-26 18:28:11 90

原创 代码随想录训练营 Day15 二叉树 part02 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2

中序(左中右)为什么不行,我们思考一下,我们一开始对左子树进行反转,接着通过中,将左右子树反转,那我这个右反转的不还是原来的左子树吗?记录每一层的元素,由于经过for里的删减增加 que.siz()会随之改变。这道题我觉得难度并不大,也并没有运用到啥算法,主要还是对二叉树的理解。再解决这道题之前,我们要了解swap函数可以实现一个节点左右孩子的交换。二叉树的层序遍历:即逐层地,从左到右访问所有节点。3.两边都不为空,且值不同,返回false。1.一边为空,一边不为空,返回false。这道题可以用递归解决。

2023-05-24 20:21:35 152

原创 代码随想录训练营Day14 第六章 二叉树part01 理论基础● 递归遍历 ● 迭代遍历● 统一迭代

二叉树的种类:1.满二叉树 2.完全二叉树 3.二叉搜索树 4.平衡二叉搜索树。递归实现二叉树的遍历主要就是要理解递归的思路,剩下的就不复杂了。中序遍历:左中右(其实就是左和中的代码调换了下位置)Day 14打卡,用时2小时,较为轻松,再接再厉!1.顺序存储(只适用于完全二叉树)1.确定递归函数的参数和返回值。后序遍历(左右中)同理同理。递归遍历 (必须掌握)3.确定单层递归的逻辑。

2023-05-23 21:37:57 174

原创 代码随想录算法训练营 Day13 栈与队列part03 ● 239. 滑动窗口最大值● 347.前 K 个高频元素● 总结

单调队列的意思就是通过滑动窗口,让元素通过或出队列,并保持单调递增或递减的形式。自定义pop,push。今天主要就是把这两道题了解了下思路,自己尝试写了写代码,由于deque、优先级队列、大顶堆小顶堆都是第一次接触,很是生疏,共花了3个小时。优先级队列已经不满足普通队列的先进先出的条件了,每次出的都是优先级最大的元素,而优先级又是自己通过元素的大小来定义的。这道题难点就在自定义单调队列,需要充分理解deque,很有难度,可以多加思考。对于优先级队列、大堆顶、小堆顶,我也是第一次接触,在此说一下自己的看法。

2023-05-23 19:40:00 215

原创 代码随想录算法训练营Day11 栈与队列part02 ● 20. 有效的括号● 1047. 删除字符串中的所有相邻重复项● 150. 逆波兰表达式求值

需要注意的是,如果按照从前往后的顺序遍历,最后遍历产生的栈,再依次出栈产生的字符串是反转的。有两种解决方法,第一种:是遍历时就从后往前遍历, for(int i=s.size()-1;栈解决的主要思想就是,遍历时,如果遇到'('、'['、'{'则分别将')'、']'、'{'入栈,遇到')'、']'、'{',就j进行出栈操作。字符无效有三种情况,分别是左括号多了(遍历后栈里不为空),括号类型不匹配,遍历未结束但栈中已经为空,而遍历依旧要出栈操作。Day11 打卡成功,耗时1.5小时,较为轻松,再接再厉!

2023-05-20 17:55:45 225 1

原创 Day10 代码随想录训练营 第五章 栈与队列part01 ● 理论基础● 232.用栈实现队列● 225. 用队列实现栈

虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,底层容器为数组和链表,所以也分为顺序结构和链式结构。在pop操作中,由于队列是先进先出,栈是先进后出,所以如果需要将栈中最后进的那个移除,首先要将它放在栈中的top位置,这样就需要重新在构建一个栈了。Day10 打卡成功,耗时1.5小时,较为容易,再接再厉吧!原理:栈:先进后出 队列:先进先出。这道题的考点就是栈与队列的转化。

2023-05-20 15:11:42 204 1

原创 代码随想录训练营Day9 字符串part02 ●28. 实现 strStr()●459.重复的子字符串●字符串总结 ●双指针回顾

KMP算法解析!!

2023-05-19 22:05:12 239 1

原创 代码随想录训练营Day8 字符串part01 344.反转字符串● 541. 反转字符串II● 剑指Offer 05.替换空格● 151.翻转字符串里的单词● 剑指Offer58-II.左旋转字符串

这道题初看很简单,一道字符替换题,但再看,却发现其不易,第一点就是空格替换成%20, 多了2个字符,第二点就是对于数组容量的扩大,需要用到resize函数。这道题难度也不大,主要需要理解“计数至2k”这句话,我们可以通过for(int i=0;(1)将字符串中多余得空格删去。(2)将整个字符串反转。第二种方法, 与上一题非常类似,依然可以通过局部反转+整体反转 达到左旋转的目的。将每个单词在进行一次反转可以自定义一个反转函数。reverse:库函数,用于字符串的反转。删去多余空格:可以采用双指针法。

2023-05-18 21:51:05 252 1

原创 代码随想录训练营Day7 哈希表part02 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和

接着通过双指针法,left=i+1,right=nums.size()-1,通过判断nums[i]+nums[left]+nums[right]是否等于0,如果大于0,则right--,如果小于0,则left++,如果等于,就将三个数存入二维数组result中。这道题涉及的四个数组元素的相加,可以运用map,先将nums1和nums2的元素分别相加并存入map中,再判断nums3和nums4元素相加后的得到的元素的相反数是否在map中,若在,即满足条件。在此,细讲这道题的另一种做法——排序+双指针法。

2023-05-16 21:42:34 515 1

原创 代码随想录训练营Day6哈希表part01,哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

哈希表理论基础。

2023-05-15 21:58:04 575 1

原创 代码训练营Day4● 24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II

x+y+n*(y+z)=2*(x+y)=>x=n*(y+z)-y=>x=(n-1)*(y+z)+z--------等于条件fast走的节点个数是slow的两倍。首先,fast每走两步,slow就走一步,相对的就是slow原地不动,fast走一步,在一个环形“赛道”上,fast一定能与slow相遇,来证明链表有环。通过公式就可以看出,假如两个指针,一个在头结点,一个在相遇点,都是速度1,他们一定会在入口点相遇。这道题要求不修改节点内部的值,那就是纯粹交换整个节点的位置,换句话说就是。浅浅盗一下卡哥的图。

2023-05-13 21:38:49 695 1

原创 代码随想录训练营第三天|| ● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表

链表元素的移除,实际上就是改变移除元素上一个节点的指针,使其跳过这个移除元素,直接指向这个移除元素的下一个节点,这样,这个包含移除元素的节点就“孤立无援”了,改变这个节点也不会对其他节点带来影响,但它依旧占据了内存中的一块位置,C++还需要用delete对这个孤家寡人进行清除。我一开始想到的就是第一种方法,据刚刚所分析,想要删除某个节点,就要知道它的上一个节点,而如果是头结点的话,不存在上一个节点,所以要进行分类,分为头结点和非头结点两类。第二种方法:使用虚拟头结点。Day 3打卡成功!

2023-05-12 18:58:33 790 1

原创 有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结

由于原来是按照非递减顺序排列的,平方后,元素大小为两边大,中间小,所以可以设置双指针,比较首尾大小,把大的放进新数组中,并缩小边界。这道题不含什么特殊算法,其实就是一个对过程的分析,可以多画图有助于理解。当然,还可以更暴力一点,使用sort函数,代码如下。Day 2打卡完成,耗时3.5小时。: 本题关键在于理解双指针思想。这道题还可以用滑动窗口的思想来做。977.有序数组的平方。209.长度最小的子数组。(浅浅盗一下卡哥的图)

2023-05-11 20:12:30 920 1

原创 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。

对于二分查找法,我自己的理解是,通过设置两个下标(left、right),分别作为区间的两个边界,在通过区间的nums(mid)来进行缩小区间。再加上if判断,如果有就直接return i,如果i一直加到了nums.size(),就说明都没有,直接返回-1;然而,由于题目已知,数组元素是按照升序排列,所以就有了新的做法——二分查找法。其实,这道题本身并没有使用指针,而是用下标代替指针,而思想正是双指针的思想。其实很好理解,在数学思维中,[1,1]是合法的,[1,1)是不合法的。

2023-05-10 19:35:09 1129 4

空空如也

空空如也

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

TA关注的人

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