- 博客(58)
- 收藏
- 关注
原创 代码随想录二刷之“图论”~GO
深搜类似于回溯法广搜能保存我们要遍历过的元素的容器就可以,。1.深度优先搜索的代码其实和回溯法很像,2.3.感悟:本题就4.本题要求找到不靠边的陆地面积,那么我们只要5.感悟:这道题只不过遇到陆地就加一,最后都减1。和上道题一个思路6.从第一组边界逆流而上,第二组边界也逆流而上,然后同时标记过的点就是答案7.8.9.1、图中的线是如何连在一起的在搜索的过程中,我们可以枚举,,在看替换后 是否在 strList里出现过,就可以判断两个字符串是否是链接的。2、起点和终点的最短路径长度。
2025-09-17 21:33:22
1052
原创 代码随想录二刷之“单调栈”~GO
这道题和接雨水的在高度计算的不同点:这道题求的是最大面积,所以栈顶是最高的,然后求面积。然后接雨水求的是凹槽内的面积,是单调递减栈。遇到高的就弹出栈,然后高度是height[i]和height[len(stack)-1]的最小值,然后求面积。如果当前遍历到的元素比栈顶元素要大,那就把栈顶元素弹出,如果栈不为空,那么下一个栈顶元素就是该元素的左边界。即需要建立个nums1和nums2的哈希映射(这里nums1是nums2的子集)总之单调栈的基本流程是这样的。感悟:遍历两遍,然后模运算,这样可以很好的实现。
2025-09-14 20:51:10
299
原创 代码随想录二刷之“贪心算法”~GO
然后nextcover赋值给curcover,然后接着计算nextcover,知道跳出去,否则如果i又等于curcover,那么接着跳一步,知道nextcover可以覆盖到。对于优化后的版本:精髓在下标i只移动到倒数第二个位置,如果i==当前覆盖到的最大下标,证明到倒数第二步,还需要一步才能跳出去(题干规定)。主体思想:比如你在排队,先让个子高的去排,然后等矮个子排的时候,高个子已经有序了。同时如果i+1到最后都大于零的话,再结合前面整体的负收益,如果total大于0,那么就可以抵消掉,否则返回-1.
2025-09-04 21:38:01
1515
4
原创 代码随想录二刷之“回溯”~GO
1.没减枝前:这里传start,不走回头路。我第一次写的时候传了path数组,略麻烦/减枝1:2.感悟:很熟练,做回溯问题的时候,脑袋里需要构建那个的图,这样代码也好写3.感悟:题不难,就是字符串和字符串转换略繁琐比如//4.无重复数组,能被反复选取感悟:对于题目允许,所以使用了i作为下一轮递归的起始索引。5.有重复数组,不能被反复选取感悟:对于题目不允许,所以使用了i+1作为下一轮递归的起始索引。i>start,而不是跳过所有位置的重复元素。若用i>1。
2025-09-01 14:01:22
883
1
原创 代码随想录二刷之“二叉树”~GO
重大感悟:我第一版写的是 res = append(res,path),存储的是path的引用,当path的底层改了之后,res的值也会随之变化!第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。感悟:这道题的思路和前序和中序构建二叉树的思路差不多,找到中间值,然后分割数组,依次向左向右递归构建平衡的二叉搜索树。感悟:对于递归要敢写,递归就是相当于假设这是个写好的函数然后调用!感悟:很简单,就是中序遍历倒过来。
2025-08-29 00:08:13
946
原创 代码随想录二刷之“栈和队列”~GO
感悟:一刷的时候,直接调用c++的单调队列,但是本次用go刷,属于。而类型断言是为了 “把通用类型转换回你实际存的类型”空接口是为了让堆能处理 “任意类型”(比如既能存。二刷心得:稍微繁琐一点点,但是大体思路上没有问题。感悟:本题刷的时候,初始化栈的时候写的有点问题。以及维护过程,本题是经典的单调队列的题目,1.用栈实现队列&&用队列实现栈。
2025-08-17 23:52:00
215
原创 代码随想录二刷之“字符串”~GO
感悟:还是go语法熟练程度的问题,需要注意的是: s[left],s[right] = s[right],s[left]这是go语言交换的常用写法。感悟:题目不难,复习了go语言的string可读性,所以如果要操纵字符串,先要改写成rune类型。感悟:kmp的这两个题确实都需要二刷了,第一个是字符串匹配的问题,第二个是字符串中是否出现重复子串。感悟:本道题确实忘了,确实不记得了。感悟:本道题不难,需要强化的是go语言append的语法,以及。感悟:kmp生疏了,但是简单复习一遍之后,感觉更好理解了。
2025-08-15 23:23:40
491
原创 代码随想录二刷之“哈希表”~GO
感悟:题目不难,还是go语法的应用问题,比如用map去模拟set(集合代表存储唯一元素),此时值用空结构体表示-可以节省内存空间!感悟:本题不难,当时想复杂了,想到回溯了。但实际上前两个数组求和,利用哈希表就可以算出次数了。用双指针做的,感悟就是去重有点麻烦。然后第一次做的时候用回溯法也思考了一下,但是略麻烦。感悟:感觉还好,固定住一个数之和,再用两根指针去逼近。感悟:这题也不难,锻炼go语法了。感悟:哈希表存储数字和对应的索引。感悟:题目不难,就是...
2025-08-13 23:05:43
216
原创 代码随想录二刷之“链表”~GO
了,(不过思路方面比一刷要清晰,只不过细节方面还需要巩固!)一直在考虑怎么连接,其实这时候需要一个tmp指针去用于连接,同时最开始tmp指向dummy,正好tmp在遍历后续中还可以指向dummy。同时错误的引入了虚拟头节点,其实虚拟头节点是为了统一头节点和中间节点操作逻辑的(比如删除头节点),但本题如果引入会造成逻辑相当混乱。感悟:本题思路也不难,就是对齐链表,但是唯一需要主要的是:fast==slow表示指向。感悟:没什么特别的,注意细节!感悟:二刷,不知道为什么总卡顿。感悟:思路还记得,双指针法!
2025-08-12 22:29:54
337
原创 代码随想录二刷之“数组”~GO
这道题的迷糊点是快慢指针的功能没有认清。慢指针的功能类似于施工队长,根据nums[fast]的情况去构建不含有val的序列,所以fast往前走,遇到不等于val的,要赋值,然后slow前移。感悟:这道题没有什么太大困难,只不过转go的时候,基本语法用的不熟。感悟:就是好几个月不刷了,滑动窗口没想到。但是知道是滑动窗口之后,思路一下子就明确了,比一刷的时候顺畅太多了!感悟:刷的时候的感悟:明确大概思路了,知道要。了(左闭右开),同时也知道记录循环次数了。本题算是一刷了,故好好写一写。
2025-08-10 19:58:15
351
1
原创 代码随想录算法训练营第52天|孤岛的总面积、沉没孤岛、水流问题、建造最大岛屿
思路:从周边找到陆地然后 通过 dfs或者bfs 将周边靠陆地且相邻的陆地都变成海洋,然后再去重新遍历地图 统计此时还剩下的陆地就可以了。思路一:直白的遍历。遍历每个点,然后看这个点能不能同时到达第一组边界和第二组边界。思路二:从第一组边界逆流而上,第二组边界也逆流而上,然后同时标记过的点就是答案。第二步:遍历每一个0的方格,并统计其相邻岛屿面积,最后取一个最大值。第一步,则遍历地图,并将岛屿的编号和面积都统计好。
2025-05-21 20:00:35
190
原创 代码随想录第51天|岛屿数量(深搜)、岛屿数量(广搜)、岛屿的最大面积
版本二:不管节点是否合法,上来就dfs,然后在终止条件的地方进行判断,不合法再retur。版本一写法:下一个节点是否能合法已经判断完了,但是版本一比版本二要高效,避免了无用的递归。
2025-05-16 21:54:24
316
原创 代码随想录算法训练营第50天|图论基础&&广搜&&深搜、所有可达路径问题
二维数组表示图结构,几个节点,就申请多大的二维数组。能保存我们要遍历过的元素的容器就可以,
2025-05-15 21:45:05
279
原创 代码随想录算法训练营第49天|leetcode42.接雨水、leetcode84.柱状图中最大的矩形
如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。同理,如果遇到相同的元素,需要先将栈顶元素弹出,然后相同的元素再入栈。显然,计算凹槽的时候选取相同元素的右边的作为凹槽的最左端。每个柱子可以向左右两边扩展,但是只能扩展到比自己矮的柱子,最大面积就是该柱子的高度乘左右扩展的距离。整体思路与接雨水是一样的,只不过一个找两边最大的,这个找两边第一个小的。单调递减栈,出栈的时候,证明找到右侧大的,也就是形成如下的凹槽。
2025-05-14 22:07:47
421
原创 代码随想录算法训练营第48天|leetcode739. 每日温度、 leetcode496.下一个更大元素 I 、leetcode503.下一个更大元素II
其实本题的思路和上面的类似,本质上都是每日温度问题,不过本题映射方面和初始化需要稍加处理。没有重复元素,我们就可以用。根据数值快速找到下标,还可以判断nums2[i]是否在nums1中出现过。直观的方法之一就是将两个数组拼起来,但是。
2025-05-13 19:30:35
222
原创 代码随想录算法训练营第46天|leetcode647. 回文子串 、leetcode 516.最长回文子序列
如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。对于遍历顺序,通过递推关系式的观察,可以看到是从下到上从左到右遍历。首先确定回文串,就是找中心然后向两边扩散看是不是对称的就可以了。,那没啥好说的了,dp[i][j]一定是false。遍历顺序:从下到上&&从左到右(由递推关系时得到的)一个元素可以作为中心点,两个元素也可以作为中心点。注意一点:这里关于j的初始化的事情,
2025-05-12 20:35:16
308
原创 代码随想录算法训练营第45天|leetcode115.不同的子序列 、leetcode583. 两个字符串的删除操作 、leetcode 72. 编辑距离
首先是两层循环,外层循环表示遍历s串,当s[i-1][j-1]的时候,有两种情况,第一种情况用s[i-1]和t[j-1]去匹配,此时就需要 dp[i - 1][j - 1]。但是s[i-1][j-1]的时候,也可以用s[i-2]和t[j-1]去匹配。除此之外,比如编辑距离类的问题找状态转移的方法:要不抓对角线,要不抓dp[i-1][j]或者dp[i][j-1]。dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。
2025-05-12 16:24:02
320
原创 代码随想录第44天|leetcode1143.最长公共子序列、leetcode1035.不相交的线 、leetcode53. 最大子序和 、leetcode392.判断子序列
即每次遍历从当前nums[i]与累加的最大值去做比较,取最大的值作为新的sum,并和res做比较。但是最后不能返回sum,因为随着sum+nums[i]的比较,大的sum会被覆盖掉,所以还要用res去保存最大更新的sum。,思路和上面差不多,但是最开始result的赋值部分出现问题,赋值成了INT_MIN,所以造成dp[0]的结果没有参与比较...的区别如下:引入最长重复的序列,所以如果序列断了,dp[i][j]要置0。这题乍一看好像挺抽象的,但是当我们细想就会发现这道题和上面的题一样。
2025-05-09 16:29:11
453
原创 代码随想录算法训练营第43天|leetcode300.最长递增子序列、leetcode674.最长连续递增序列、leetcode.最长重复字数组
所以对于dp[i][0]或者dp[0][j]都是没有意义的,所以dp数组的含义要定义为:dp[i][j],以。本题贪心相比动态规划而言,要简单不少。因为只需要记录最大的cnt就可以,每一次循环都去判断是不是递增的,如果是递增的,方法一:我的复杂做法,运用了两层循环,之所以做的这么麻烦,是因为刚刚做完上面的题目,有了思维定势。dp[i][j]都是由dp[i - 1][j - 1]推出。,也就是dp[j]都是由dp[j - 1]推出。方法二:一层循环的动态规划:但其实,既然是。但是通过代码可以发现,
2025-05-08 16:23:23
427
原创 代码随想录算法训练营第42天|leetcode188.买卖股票的最佳时机IV、leetcode309.最佳买卖股票时机含冷冻期、leetcode714.买卖股票的最佳时机含手续费
本题和前几个题的思路大体相似,只不过涉及到交易之后还要给手续费的问题,所以写状态转移方程的时候,还要考虑fee。类似,只不过上个题把k固定为2,本题为k,所以初始化和下面的递推关系式相似。本题包含了冷冻期,所以我设置了三个状态:1.本题的大体思路和相似。
2025-05-07 18:05:44
179
原创 代码随想录算法训练营第41天|leetcode121.买卖股票的最佳时机、leetcode122.买卖股票的最佳时机II 、leetcode123.买卖股票的最佳时机III
所以dp[4][4]已经包含了dp[4][2]的情况。思路1:动态规划,dp[i]表示第i天的最大利润,同时dp[i] = max(dp[i-1],prices[i]-min_price),并且不断更新最小价格。,有两种情况,所得最大现金要不和昨天持有股票一样,要不就今天入股的,也就是在昨天的最大现金的基础之上花prices[i]的钱去入股。,也有两种情况,要不和昨天不持有股票一样,要不就把以前买的股票在今天抛售掉。思路2:贪心算法,下面的贪心算法的总体思想和上面的一维数组的思想大同小异。
2025-04-29 21:16:57
391
原创 代码随想录第39天|leetcode198.打家劫舍、leetcode213.打家劫舍II 、leetcode337.打家劫舍III
思路:首先将根节点传入函数,如果当前节点为空,返回<0,0>,然后进行二叉树的后序遍历。自底向上进行遍历,分两种情况讨论,如果偷取cur,那么就不偷左右节点。如果偷取cur,那么偷取较大的左右节点,代码如下所示。所以dp数组(dp table)以及下标的含义:下标为0记录不偷该节点所得到的的最大金钱,下标为1记录偷该节点所得到的的最大金钱。当前房屋偷与不偷取决于前一个房屋和前两个房屋是否被偷,所以就可以得到相应的dp数组。这里有个点:对于情况2或者情况3,
2025-04-29 17:48:20
299
原创 代码随想录算法训练营第38天|leetcode322.零钱兑换、leetcode279.完全平方数、leetcode139.单词拆分
这道题和上面的题类似,几乎一样。但是由于上题的初始化有点晕,所以如果是求最小数量,就初始化成INT_MAX,然后遍历。依然是完全背包的经典应用,本题并不强调集合是组合还是排列。
2025-04-05 21:17:32
324
原创 代码随想录算法训练营第37天|完全背包理论基础、leetcode518.零钱兑换2️⃣、leetcode377.组合总和5️⃣、爬楼梯进阶
如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,举一个例子:计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有{3,1}这样的集合,因为nums遍历放在外层,3只能出现在1后面!那么就是先把1加入计算,然后再把5加入计算,得到的方法数量只有{1, 5}这种情况。而不会出现{5, 1}的情况。第i件物品的重量是weight[i],得到的价值是value[i]。假设:coins[0] = 1,coins[1] = 5。这道题没什么难的,但是遍历方式的变化有点儿别扭。
2025-04-03 20:55:34
402
原创 代码随想录算法训练营第36天|leetcode1049.最后一块石头的重量、leetcode494.目标和、leetcode474.一和零
只不过物品的重量有了两个维度而已。物品就是strs里的字符串,背包容量就是题目描述中的m和n。应该担心计算的过程中向下取整有没有影响。例如sum是5,target是2 的话其实就是无解的。这里的x,就是bagSize,也就是我们后面要求的背包容量。类似,但是那道题求的是背包是否装满,这道题求的是背包最多可以装多少。没做出来,好像用回溯法或者动态规划都可以做出来。这道题给我的感觉和昨天的。
2025-04-02 22:31:13
195
原创 代码随想录算法训练营第35天|背包问题、leetcode.416分割等和子集
所谓滚动数组,就是把上一行的数据压缩到一起。方法一:回溯法,但是会。
2025-04-01 20:15:12
265
原创 代码随想录算法训练营第34天|leetcode62.不同路径、leetcode63.不同路径2️⃣、leetcode343.整数拆分、leetcode96。不同的二叉搜索树
根据上述代码可以发现,dp[i-1][j]只依赖于上一行状态的代码。所以可以优化成一位数组。首先初始化代码,因为第一行都是1;思路2:下面的代码和上面的,就是递归方程变了一下,不过下面的相当于把上面的dp[i]*dp[i-j]拆开了。需要举例,画图,分析,才能找到递推的关系...复杂。思路1:动态规划--》二维数组。
2025-03-31 21:49:15
286
原创 代码随想录算法训练营第32天|leetcode
思路:首先定义dp数组含义,然后初始化,然后构造递推方程。思路2:优化,仅开辟两个数组空间就够了。
2025-03-29 16:14:42
226
原创 代码随想录算法训练营第31天|leetcode56.合并区间、leetocode738.单调递增的数字
思路:合并区间或者区间重叠类问题貌似是一样的呢。也就是设置左右指针,然后遍历下去,如果。,那么就取他俩的最大值作为新边界,循环往复,最后压入数组当中。但是对于最后一组数,strNum[i - 1]--,然后strNum[i]给为9。,所以最后还需要单独压一遍~
2025-03-28 21:35:30
278
原创 代码随想录算法训练营第30天|leetcode452.用最少数量的箭引爆气球、leetcode435.无重叠区间、leetcode763.划分字母区间
其实重叠算法就是说:已有的右边界与新的边界的左边界相比,如果没有重叠,就更新right,否则(发生重叠),right = min(right,intervals[i][1]),取最小其实还是贪心。这道贪心我是有思路的,也就是说首先统计每个元素的最远到达的地方。贪心题目有时候就是这样,看起来很简单,思路很直接,但是一写代码就感觉贼复杂无从下手。首先遍历整个字符串s,设置左右指针,右指针是为了找到之后与索引做差,从而或者分割点之间的距离的。思路:这道题运用双指针,如果left>right,就计数。
2025-03-27 16:25:07
374
原创 代码随想录第29天|leetcode134.加油站、leetcode135.分发糖果、leetcode860.柠檬水找零、leetcode406.根据身高重建队列
从头开始遍历,设置cursum,然后开始累加,如果cursum<0,证明所有从前面来的出发的车开到这里都会没油,所以这个时候cursum = 0,同时从这个的后一个加油站作为起始点(start)接着遍历。外面的for模拟开始的加油站,如果有余,那就以那个为起点,遍历一圈,如果转一圈依旧有余,那么返回i,否则返回-1.然后再插入到数组当中。思路:这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,这样从局部最优推出了全局最优,即:相邻的孩子中,评分高的孩子获得更多的糖果。
2025-03-26 21:08:53
439
原创 代码随想录算法训练营第28天|leetcode122.买卖股票的最佳时机2️⃣、leetcode55.跳跃游戏、leetcode45.跳跃游戏2️⃣、leetcode1005.K次取反后最大化的数组和
优化:由于题干已经说肯定能到达最后那个位置,所以如果可以到nums.size()-2下标对应的位置的话,如果i==cur,那么意味着还差一步就可以到达终点,ans++;=cur,那么意味着本来就可以到达终点。只要遇到了大于0的数,判断k的奇偶性,如果k为奇数,就把那个正数取相反数。如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。排完序之后=> [-8,-5,-5,-3,-2,3] => [8,5,5,3,2,-3]
2025-03-25 21:57:52
356
原创 代码随想录算法训练营第27天|leetcode455.分发饼干、leetcode376.摆动序列、leetcode53.最大子序和
不赘述,思路很简单了。但是我下面写复杂了....这么简单的题写的这么复杂...没有保持循环不变量。饼干和胃口同时变了,得固定一个。比如说 1 -2 3. 3比-1大的话,sum直接就🟰3.然后每次这个局部最优的sum与全局的res去比较。所以下面固定了胃口,用饼干去循环,如果s[i]>=g[idx],再移动到下一个孩子的胃口。从局部最优转向全局最优。
2025-03-24 21:53:06
405
原创 代码随想录算法训练营第25天|leetcode
1.思路:如下优化方法:使用数组替换哈希表。2.3.。nums[i] == nums[i-1] 且 used[i-1]==1:说明同一树枝上有重复元素,可以重复选取nums[i] == nums[i-1] 且 used[i-1]==0:说明同一树层上有重复元素,不可以重复选取。
2025-03-22 11:53:41
428
原创 代码随想录算法训练营第24天|leetcode93.复原IP地址、leetcode78.子集、leetcode90.子集2️⃣
erase(pos,len)和substr(pos,len)思路:这道题不是很难,但是细节问题出了好多错误。思路1:就是和第二题的思路多一个。isIP函数中的非法IP的控制。把所有节点都记录下来。
2025-03-21 15:59:08
280
原创 代码随想录算法训练营第23天|leetcode39.组合总和、leetcode40.组合2️⃣、leetcode131.分割回文串
我放在了没层for循环的的结尾,如果该层的candidates[i]与下层对应的candidates[i+1]相等,那就i++;因为如下图所示,排序后的数组连续的两个1连一起会造成数组的重复。但是有个点:最开始我看没有重复元素,所以我没有设置start那一项,发现就没法去重了。和3,2,2是一个,所以我发现得到的结果要单调递增,这样才能去重。思路:但是我去重打逻辑和代码随想录里的不太一样,我加了下面这行代码。⚠️:这个for循环后半部分的剪枝,要求初始数组是递增的。但是上述代码是可以优化的,如下所示。
2025-03-20 20:10:33
457
原创 代码随想录算法训练营第22天|leetcode77.组合、leetcode216.组合2️⃣、leetcode17.电话号码的字母组合
图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。思路:首先确定函数的返回值和参数(一般是void,遇到回溯的时候考虑其他类型返回值)中从startIndex开始遍历的。因为本题每一个数字代表的是不同集合,也就是。思路:与上题类似,都是组合类问题。主要点就是递归与回溯。思路:注意这里for循环,可不像是在。除此之外还要考虑到特殊情况,比如。不足我们需要的元素个数。求不同集合之间的组合。求同一个集合中的组合。
2025-03-19 19:43:14
337
原创 代码随想录算法训练营第21天|leetcode669.修剪二叉搜索树、leetcode108.将有序数组转换为二叉搜索树、leetcode538.把二叉搜索树转换为累加树
思路2:迭代法,也就是首先找到第一个节点,因为二叉搜索树的根节点属于有序数组中的中间位置。然后找到第一个节点之后,就开始向左迭代和右迭代。左右迭代的时候,首先判断是不是空指针,如果不是的话判断其cur->left(right)与val的关系,然后向left的方向迭代。思路:其实没有那么复杂,我第一次做的时候,我就考虑到删除节点,然后重构二叉树。但是很复杂,甚至联想到了昨天的那道删除二叉树的那个题目。比如3的左孩子是2,右孩子是5.但是5如果没有迭代到,也别怕遍历不到,因为已经有指针指向了5的头节点的了。
2025-03-18 22:30:11
206
原创 代码随想录算法训练营第20天|leetcode235.二叉搜索树的最近公共祖先、leetcode701.二叉搜索树中的插入操作、leetcode450.删除二叉搜索树中的节点
设置快慢指针,快指针先走,并不断比较判断cur的值和val的值。如果cur大那就左移,反之右移。查找目标区间,遇到目标区间内的节点,直接返回。思路:这道题好繁琐啊,判断条件太多了。不用使用回溯,二叉搜索树。
2025-03-17 19:53:39
259
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅