- 博客(55)
- 收藏
- 关注
原创 代码随想录打卡总结
第一次系统性的刷leetcode,跟着卡哥一个板块一个板块的攻克真的很有收获,第一次刷基本题目都能保证独立写出了,但图论章节有所懈怠,后面还需加强努力。这次训练营体验也让我发现了坚持的重要性,之前自己刷题老是一天刷很多题,但没办法每天坚持,最后也只刷了一点题。这次有卡哥带领,安排每日计划,不知不觉中遍刷到100题,150题了。希望能有更多的这种打卡营的参与机会,继续每天积少成多。
2024-08-09 17:27:58 156 1
原创 代码随想录算法训练营第六十二天|Floyd 算法精讲 、A * 算法精讲 (A star算法)
【代码】代码随想录算法训练营第六十二天|Floyd 算法精讲 、A * 算法精讲 (A star算法)
2024-08-09 17:22:33 213
原创 代码随想录算法训练营第六十一天|Bellman_ford 队列优化算法(又名SPFA)、bellman_ford之判断负权回路
【代码】代码随想录算法训练营第六十一天|Bellman_ford 队列优化算法(又名SPFA)、bellman_ford之判断负权回路。
2024-08-09 17:17:07 224
原创 代码随想录算法训练营第五十九天|dijkstra(堆优化版)精讲 、Bellman_ford 算法精讲
【代码】代码随想录算法训练营第五十九天|dijkstra(堆优化版)精讲 、Bellman_ford 算法精讲。
2024-08-09 16:59:52 261
原创 代码随想录算法训练营第五十八天|拓扑排序精讲 、dijkstra(朴素版)精讲
【代码】代码随想录算法训练营第五十八天|拓扑排序精讲 、dijkstra(朴素版)精讲。
2024-08-09 16:54:31 256
原创 代码随想录算法训练营第五十六天|108.冗余连接 、109.冗余连接II
本题的本质是 :有一个有向图,是由一颗有向树 + 一条有向边组成的 (所以此时这个图就不能称之为有向树),现在让我们找到那条边 把这条边删了,让这个图恢复为有向树。首先寻找两个节点的根节点,如果根节点相同则直接返回,否则将一个节点的根设置为另一个节点的根。方法实现寻根操作,并应用了路径压缩技术,递归地将直接或间接的父节点指向根节点,优化了查找效率。方法判断两个节点是否在同一个集合中,通过比较它们的根节点是否相同。方法重新初始化并查集,使每个节点的父节点指向自己。,初始化并查集,然后循环读取每对节点。
2024-08-09 16:43:25 459
原创 代码随想录算法训练营第五十五天|并查集理论基础 、107.寻找存在的路径
即需要判断两个元素是否在同一个集合里的时候,我们就要想到用并查集。并查集常用来解决连通性问题。
2024-08-09 16:35:54 200
原创 代码随想录算法训练营第五十四天|110.字符串接龙 、105.有向图的完全可达性 、106.岛屿的周长
每个陆地单元格理论上有四个边界,但由于每个边界会被相邻的单元格共享两次(一次由当前单元格统计,一次由相邻的单元格统计),所以实际的边界总数是。这里只检查上边和左边,因为下边和右边的相邻陆地将由对应的下一行和下一列来检查,避免重复计算。遍历当前字符串的每个字符,然后遍历26个字母,尝试用每个字母替换当前位置的字符,生成新的字符串。将当前节点标记为已访问,并遍历当前节点的所有邻接节点。),则直接返回,这是DFS的剪枝操作,避免循环。通过循环读取每条边的信息,并构建图的邻接表。,使用列表的列表结构表示,长度为。
2024-08-09 16:27:37 330
原创 代码随想录算法训练营第五十二天|101.孤岛的总面积 、102.沉没孤岛 、103.水流问题 、104.建造最大岛屿
第二步:再遍历地图,遍历0的方格(因为要将0变成1),并统计该1(由0变成的1)周边岛屿面积,将其相邻面积相加在一起,遍历所有 0 之后,就可以得出 选一个0变成1 之后的最大面积。函数是一个递归函数,用于深度优先搜索(DFS)遍历网格中的陆地区域。它将访问过的陆地标记为0,并统计陆地的数量。函数开始处,先进行条件判断,如果当前坐标越界或不是陆地(值为1),则直接返回。然后,代码分别从网格的四边开始,向中间搜索,对每个找到的陆地区域执行。如果当前单元格是陆地,将其标记为已访问(设置为0),并增加。
2024-08-09 16:14:20 389
原创 代码随想录算法训练营第五十一天|99.岛屿数量 深搜 、99.岛屿数量 广搜、岛屿的最大面积
本题思路:用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋节点的时候直接跳过。这样计数器就是最终岛屿的数量。dfs只处理下一个节点,即在主函数遇到岛屿就计数为1,dfs处理接下来的相邻陆地。100. 岛屿的最大面积。相邻的陆地连接形成。
2024-08-09 15:05:31 379
原创 代码随想录算法训练营第五十天|(图论)深搜理论基础 、98. 所有可达路径、广搜理论基础
由于dfs是向一个方向进行搜索的,因此需要回溯。*可用map函数来迭代对象。
2024-08-09 12:49:25 186
原创 代码随想录算法训练营第四十九天| 42. 接雨水 、84.柱状图中最大的矩形
每一列雨水的高度,取决于,该列 左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度,即: min(lHeight, rHeight) - height。一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。遇到相同的元素,更新栈内下标,就是将栈里元素(旧下标)弹出,将新元素(新下标)加入栈中,只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。所以本题单调栈的顺序正好与接雨水反过来。
2024-08-02 21:37:09 410
原创 代码随想录算法训练营第四十八天|(单调栈) 739. 每日温度、 496.下一个更大元素 I 、503.下一个更大元素II
遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。把两个nums拼在一起来试下一轮的环。时间复杂度为O(n)。
2024-08-01 15:30:02 353
原创 代码随想录算法训练营第四十七天| 647. 回文子串、516.最长回文子序列 (动态规划结束)
s[i]与s[j]不相同:说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。加入s[j]的回文子序列长度为dp[i + 1][j],加入s[i]的回文子序列长度为dp[i][j - 1]。dp[i][j]含义与之前的有区别:找到dp[i][j]的依赖关系,即判断一个子字符串(字符串下标范围[i,j])是否回文,依赖于,子字符串(下标范围[i + 1, j - 1])) 是否是回文。
2024-07-31 17:41:42 486
原创 代码随想录算法训练营第四十五天| 115.不同的子序列 、583. 两个字符串的删除操作 、 72. 编辑距离
当word1[i - 1] 与 word2[j - 1]相同的时候,dp[i][j] = dp[i - 1][j - 1];情况三:同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2。dp数组:dp[i][j] 为以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。(可以看成s里面删除元素变成t)情况一:删word1[i - 1],最少操作次数为dp[i - 1][j] + 1。word1[i]!的时候我们的操作 是。
2024-07-31 15:42:21 335
原创 代码随想录算法训练营第四十四天|1143.最长公共子序列 、 1035.不相交的线、53. 最大子序和 、392.判断子序列
如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
2024-07-26 21:36:39 238
原创 代码随想录算法训练营第四十三天|300.最长递增子序列 、674. 最长连续递增序列 、 718. 最长重复子数组
如果定义 dp[i][j]为 以下标i为结尾的A,和以下标j 为结尾的B,那么 第一行和第一列毕竟要进行初始化,如果nums1[i] 与 nums2[0] 相同的话,对应的 dp[i][0]就要初始为1, 因为此时最长重复子数组为1。dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。当然可以,就是实现起来麻烦一些。
2024-07-26 13:15:01 193
原创 代码随想录算法训练营第四十二天| 188.买卖股票的最佳时机IV 、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
dp[i][0] 表示第i天持有股票所得最多现金,dp[i][1] 表示第i天不持有股票所得最多现金。使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]题目要求是至多有K笔交易,那么j的范围就定义为 2 * k + 1 就可以了。
2024-07-25 23:32:31 315
原创 代码随想录算法训练营第四十一天| 121. 买卖股票的最佳时机 、 122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
那么第i天持有股票即dp[i][0],如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 即:dp[i - 1][1] - prices[i]。同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来。
2024-07-22 15:57:18 514
原创 代码随想录算法训练营第四十天|(打家劫舍)198.打家劫舍 、 213.打家劫舍II、337.打家劫舍III
初始化:dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1])递推公式:dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])由于递归调用每一层都会传递一个新的dp数组,因此长度为2的dp数组已够用。此题不用dp数组来记录前面的状态,用pre_max和curr_max来记录。dp数组含义:此题中dp为一维长度为2的数组,方法一:暴力递归(超出时间限制)
2024-07-22 14:21:03 456
原创 代码随想录算法训练营第三十八天| 322. 零钱兑换、 279.完全平方数、139.单词拆分
考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
2024-07-20 15:09:06 216
原创 代码随想录算法训练营第三十七天|( 完全背包) 518. 零钱兑换 II 、 377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)
我们知道01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。而完全背包的物品是可以添加多次的,所以要从小到大去遍历。因为如果先遍历物品,那么3一定在1后面,就只有(1,3)这种组合,没有(3,1)这种组合了。
2024-07-19 18:06:34 233
原创 代码随想录算法训练营第三十六天|1049. 最后一块石头的重量 II 、 494. 目标和 、 474.一和零
left + right = sum,而sum是固定的。right = sum - left公式来了, left - (sum - left) = target 推导出 left = (target + sum)/2。target是固定的,sum是固定的,left就可以求出来。本题要如何使表达式结果为target,既然为target,那么就一定有 left组合 - right组合 = target。分成两堆石头,一堆石头的总重量是dp[target],另一堆就是sum - dp[target]。
2024-07-18 16:59:25 254
原创 代码随想录算法训练营第三十五天| 01背包问题 二维 、01背包问题 一维 、 416. 分割等和子集
在使用二维数组的时候,递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);倒序遍历的原因是,本质上还是一个对二维数组的遍历,并且右下角的值依赖上一层左上角的值,因此需要保证左边的值仍然是上一层的,从右向左覆盖。(2)放物品i,背包容量为j时,所能装的最大价值:dp[ i -1][ j - weight[i] ] + value[i](1)不放物品i,背包容量为j时,所能装的最大价值为:dp[ i -1][j]
2024-07-17 16:40:21 487
原创 代码随想录算法训练营第三十四天| 62.不同路径、 63. 不同路径 II 、343. 整数拆分 (可跳过)、96.不同的二叉搜索树 (可跳过)
跟上一题思路相同,不过要注意障碍物的处理。
2024-07-16 16:25:21 283
原创 代码随想录算法训练营第三十三天|(动态规划)509. 斐波那契数 、 70. 爬楼梯、746. 使用最小花费爬楼梯
递推公式:dp[i] = min((dp[i-1] + cost[i-1]) , (dp[i-2] + cost[i-2]))1. 确定dp数组的定义,以及下标的含义。dp[i]:到达i的位置所需要的最小花费。3. dp数组如何初始化。
2024-07-15 16:45:39 238
原创 代码随想录算法训练营第三十天|56. 合并区间 、 738.单调递增的数字 、968.监控二叉树 (可跳过)(贪心和二叉树结合)
这是很重要的一个线索,摄像头可以覆盖上中下三层,如果把摄像头放在叶子节点上,就浪费的一层的覆盖。因为头结点放不放摄像头也就省下一个摄像头, 叶子节点放不放摄像头省下了的摄像头数量是指数阶别的。那么有同学可能问了,为什么不从头结点开始看起呢,为啥要从叶子节点看呢?所以把摄像头放在叶子节点的父节点位置,才能充分利用摄像头的覆盖面积。从题目中示例,其实可以得到启发,使用后序左右中的顺序从下往上遍历。
2024-07-15 15:15:09 225
原创 代码随想录算法训练营第二十九天|(重叠区间)452. 用最少数量的箭引爆气球、 435. 无重叠区间 、 763.划分字母区间
既然按照起始位置排序,那么就从前向后遍历气球数组,靠左尽可能让气球重复。只不过对应的遍历顺序不同,我就按照气球的起始位置排序了。那么按照气球起始位置排序,还是按照气球终止位置排序呢?从前向后遍历遇到重叠的气球了怎么办?
2024-07-14 20:06:54 128
原创 代码随想录算法训练营第二十八天| 134. 加油站 、 135. 分发糖果 、860.柠檬水找零 、 406.根据身高重建队列
i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。那么为什么一旦[0,i] 区间和为负数,起始位置就可以是i+1呢,i+1后面就不会出现更大的负数?如果出现更大的负数,就是更新i,那么起始位置又变成新的i+1了。这样从局部最优推出了全局最优,即:相邻的孩子中,评分高的孩子获得更多的糖果。注意,此题中只有三种面额的钞票,要根据钞票数量来做。
2024-07-14 15:44:19 339
原创 代码随想录算法训练营第二十七天|122.买卖股票的最佳时机II 、55. 跳跃游戏、 45.跳跃游戏II 、 1005.K次取反后最大化的数组和
i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。如果 cover 大于等于了终点下标,直接 return true 就可以了。思路:计算利润序列,只需要收集正利润。想获得利润至少要两天为一个交易单元。
2024-07-09 16:26:18 185
原创 代码随想录算法训练营第二十六天|(贪心算法)455.分发饼干 、376. 摆动序列 、53. 最大子序和
局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。如果 -2 1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方!然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。可以尝试使用贪心策略,先将饼干数组和小孩数组排序。全局最优:选取最大“连续和”
2024-07-08 20:51:01 200 1
原创 代码随想录算法训练营第二十五天|491.递增子序列 、46.全排列 、47.全排列 II、332.重新安排行程(可跳过)、51.N皇后(适当跳过) 、37.解数独(适当跳过)
同时,在叶子节点上取结果,当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。去重:nums[i] == nums[i-1]在树层上去重:used[i-1] == 0。在树枝上去重:used[i-1] == 1。for循环里不用startIndex了,
2024-07-08 15:35:19 288
原创 代码随想录算法训练营第二十四天|93.复原IP地址 、 78.子集 、 90.子集II
主要考虑到如下三点:段位以0为开头的数字不合法、段位里有非正整数字符不合法、段位如果大于255了不合法。递归调用时,下一层递归的startIndex要从i+2开始(因为需要在字符串中加入了分隔符。此题不是在叶子结点处取值,是每进入一次递归,都要把此次递归得到path加入到result中。),同时记录分割符的数量pointNum 要 +1。删掉就可以了,pointNum也要-1。最后就是在写一个判断段位是否是有效段位了。回溯的时候,就将刚刚加入的分隔符。
2024-07-06 22:18:19 165
原创 代码随想录算法训练营第二十三天| 39. 组合总和 、40.组合总和II 、131.分割回文串(判断回文串的方法)
此题可以重复元素,因此不需要再回溯时设定i+1。此题需要再写一个函数来判断是否是回文串。
2024-07-04 15:43:30 220
原创 代码随想录算法训练营第二十二天|(回溯算法) 77. 组合 、 216.组合总和III 、 17.电话号码的字母组合
递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。,是的,我指的是所有回溯法的问题都可以抽象为树形结构!因为回溯法解决的都是在集合中递归查找子集,
2024-07-03 20:41:14 206
原创 代码随想录算法训练营第二十一天| 669. 修剪二叉搜索树 、 108.将有序数组转换为二叉搜索树 、538.把二叉搜索树转换为累加树(二叉树最后一天)
【代码】代码随想录算法训练营第二十一天| 669. 修剪二叉搜索树 、 108.将有序数组转换为二叉搜索树 、538.把二叉搜索树转换为累加树(二叉树最后一天)
2024-07-03 13:55:41 125
原创 代码随想录算法训练营第二十天| 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
插入二叉搜索树不需要调整整个树的结构,只需要把需要插入的节点放在叶子节点上即可,所以当node is None的时候,是插入新节点的时候。利用搜索二叉树的特性,p q节点与当前节点的大小关系,决定了下一步遍历的子树的方向。5.左不空,右不空(关键难点,找到比删除节点大的下一个数)此题不同于上一题,涉及到二叉树的修改。精简版写法:不要忘记return!3.删除的节点左不空,右为空。2.删除的节点为叶子节点。1.没找到删除的节点。
2024-07-02 22:45:36 186
原创 代码随想录算法训练营第十九天| 530.二叉搜索树的最小绝对差、 501.二叉搜索树中的众数 、 236. 二叉树的最近公共祖先
该题目需要自底向上查找,左右中查找顺序能完成以上任务。二叉搜索树均可采用中序遍历,转换为一个有序数组。使用中序遍历 + 字典。
2024-06-27 18:48:44 250
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人