自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法工程师重生之第四十六天(字符串接龙 有向图的完全可达性 岛屿的周长)

参考文献。

2024-11-07 20:46:19 1091

原创 算法工程师重生之第四十五天(孤岛的总面积 沉没孤岛 水流问题 建造最大岛屿)

参考文献。

2024-11-06 23:21:11 836

原创 算法工程师重生之第四十四天(岛屿数量 深搜 广搜 岛屿的最大面积)

参考文献。

2024-11-05 20:39:25 334

原创 算法工程师重生之第四十三天(图论理论基础 深搜理论基础 所有可达路径 广搜理论基础)

以上知识点 大家先有个印象,上面提到的每个知识点,其实都需要大篇幅才能讲明白的。我这里先给大家做一个概括,后面章节会针对每个知识点都会有对应的算法题和针对性的讲解,大家再去深入学习。图论是非常庞大的知识体系,上面的内容还不足以概括图论内容,仅仅是理论基础而已。在图论章节我会带大家深入讲解 深度优先搜索(DFS)、广度优先搜索(BFS)、并查集、拓扑排序、最小生成树系列、最短路算法系列等等。敬请期待!二、深度优先搜索理论基础录友们期待图论内容已久了,为什么鸽了这么久,主要是最近半年开始更新。

2024-11-04 22:30:46 739

原创 算法工程师重生之第四十二天(接雨水 柱状图中最大的矩形)

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。求在该柱状图中,能够勾勒出来的矩形的最大面积。最大的矩形为图中红色区域,面积为 10。个非负整数表示每个宽度为。

2024-11-02 23:26:51 342

原创 算法工程师重生之第四十一天(每日温度 下一个更大元素 I 下一个更大元素II)

是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。- 2 ,用加粗斜体标识,nums2 = [1,3,4,- 4 ,用加粗斜体标识,nums2 = [1,2,3,第二个 1 的下一个最大的数需要循环搜索,结果也是 2。- 4 ,用加粗斜体标识,nums2 = [1,3,不存在下一个更大元素,所以答案是 -1。- 2 ,用加粗斜体标识,nums2 = [1,不存在下一个更大元素,所以答案是 -1。不存在下一个更大元素,所以答案是 -1。

2024-11-01 20:32:19 857

原创 算法工程师重生之第四十天(回文子串 最长回文子序列 动态规划总结)

参考文献 代码随想录 一、回文子串给你一个字符串 ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。示例 1:输入:s = "abc"输出:3解释:三个回文子串: "a", "b", "c"示例 2:输入:s = "aaa"输出:6解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"提示:当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况

2024-10-31 23:26:44 660

原创 算法工程师重生之第三十九天(不同的子序列 两个字符串的删除操作 编辑距离 编辑距离总结篇 )

word2[j - 1]),此时就需要编辑了,如何编辑呢?操作一:word1增加一个元素,使其word1[i - 1]与word2[j - 1]相同,那么就是以下标i-2为结尾的word1 与 i-1为结尾的word2的最近编辑距离 加上一个增加元素的操作。即 dp[i][j] = dp[i - 1][j] + 1;

2024-10-30 22:04:20 722

原创 算法工程师重生之第三十八天(最长公共子序列 不相交的线 最大子序和 判断子序列)

但无法画出第三条不相交的直线,因为从 nums1[1]=4 到 nums2[2]=4 的直线将与从 nums1[2]=2 到 nums2[1]=2 的直线相交。如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。

2024-10-29 23:30:36 736

原创 算法工程师重生之第三十七天(最长递增子序列 最长连续递增序列 最长重复子数组 )

尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。最长递增子序列是 [2,3,7,101],因此长度为 4。最长连续递增序列是 [1,3,5], 长度为3。长度最长的公共子数组是 [3,2,1]。最长连续递增序列是 [2], 长度为1。,找到其中最长严格递增子序列的长度。给定一个未经排序的整数数组,找到最长且。、长度最长的子数组的长度。,并返回该序列的长度。

2024-10-28 20:33:08 383

原创 算法工程师重生之第三十六天(买卖股票的最佳时机IV 最佳买卖股票时机含冷冻期 买卖股票的最佳时机含手续费 )

随后,在第 5 天 (股票价格 = 0) 的时候买入,在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3。在第 2 天 (股票价格 = 2) 的时候买入,在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4。在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2。这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。

2024-10-26 21:14:23 396 1

原创 算法工程师重生之第三十五天(买卖股票的最佳时机 买卖股票的最佳时机II 买卖股票的最佳时机III )

随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3。在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0。

2024-10-25 23:02:56 995

原创 算法工程师重生之第三十四天(打家劫舍 打家劫舍II 打家劫舍III)

参考文献你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,。给定一个代表每个房屋存放金额的非负整数数组,计算你,一夜之内能够偷窃到的最高金额。[1,2,3,1]4偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4。12偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。

2024-10-24 21:07:58 902

原创 算法工程师重生之第三十三天(零钱兑换 完全平方数 单词拆分 背包问题总结)

这篇背包问题总结篇是对背包问题的高度概括,讲最关键的两部:递推公式和遍历顺序,结合力扣上的题目全都抽象出来了。而且每一个点,我都给出了对应的力扣题目。最后如果你想了解多重背包,可以看这篇动态规划:关于多重背包,你该了解这些!,力扣上还没有多重背包的题目,也不是面试考察的重点。如果把我本篇总结出来的内容都掌握的话,可以说对背包问题理解的就很深刻了,用来对付面试中的背包问题绰绰有余!

2024-10-23 23:42:57 884

原创 算法工程师重生之第三十二天(完全背包 零钱兑换 II 组合总和 Ⅳ 爬楼梯 (进阶))

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

2024-10-22 20:47:31 1043

原创 算法工程师重生之第三十一天(最后一块石头的重量 II 目标和 一和零 )

不少同学刷过这道题,可能没有总结这究竟是什么背包。此时我们讲解了0-1背包的多种应用,纯 0 - 1 背包 (opens new window)是求 给定背包容量 装满背包 的最大价值是多少。416. 分割等和子集 (opens new window)是求 给定背包容量,能不能装满这个背包。1049. 最后一块石头的重量 II (opens new window)是求 给定背包容量,尽可能装,最多能装多少494. 目标和 (opens new window)是求 给定背包容量,装满背包有多少种方法。

2024-10-22 00:23:05 649

原创 算法工程师重生之第三十天( 01背包问题 二维 01背包问题 一维 分割等和子集 )

首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图:在看其他情况。状态转移方程。

2024-10-19 21:29:12 907

原创 算法工程师重生之第二十九天(不同路径 不同路径 II 整数拆分 不同的二叉搜索树)

这道题目虽然在力扣上标记是中等难度,但可以算是困难了!首先这道题想到用动规的方法来解决,就不太好想,需要举例,画图,分析,才能找到递推的关系。然后难点就是确定递推公式了,如果把递推公式想清楚了,遍历顺序和初始化,就是自然而然的事情了。可以看出我依然还是用动规五部曲来进行分析,会把题目的方方面面都覆盖到!而且具体这五部分析是我自己平时总结的经验,找不出来第二个的,可能过一阵子 其他题解也会有动规五部曲了。当时我在用动规五部曲讲解斐波那契的时候,一些录友和我反应,感觉讲复杂了。

2024-10-18 21:04:40 1046

原创 算法工程师重生之第二十八天(理论基础 斐波那契数 爬楼梯 使用最小花费爬楼梯 )

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

2024-10-17 21:29:30 1039

原创 算法工程师重生之第二十七天(合并区间 单调递增的数字 监控二叉树 总结)

参考文献以数组intervals表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].[[1,5]]区间 [1,4] 和 [4,5] 可被视为重叠区间。问题分析要合并,说明有新的数据生成,如果你存在元数组上, 那么就要删除重叠的那个几个,然后在添加新的,那么数组的长度会发生改变,那么很麻烦,所以使用新的一个数组,来存储。

2024-10-16 20:59:17 850

原创 算法工程师重生之第二十六天(用最少数量的箭引爆气球 无重叠区间 划分字母区间 )

用一个字典记录每个字母最后出现的位置,然后定义一个开始位置,结束位置,用于统计长度,如果当前的i等于end说明已经遍历到从start到end字符串中出现的所有字母,end每次统计从start开始往后遍历的每个元素最后出现的次数和自己取一个最大值,那么就能保证每个分割的元素只用一次,然后在更新start为i + 1。就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。

2024-10-15 20:27:40 1026

原创 算法工程师重生之第二十五天(加油站 分发糖果 柠檬水找零 根据身高重建队列 )

如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。如果ratings[i] > ratings[i - 1] 那么[i]的糖 一定要比[i - 1]的糖多一个,所以贪心:candyVec[i] = candyVec[i - 1] + 1。此时油箱有 = 0 + 4 = 4 升汽油。

2024-10-14 21:21:25 867

原创 算法工程师重生之第二十四天(买卖股票的最佳时机II 跳跃游戏 跳跃游戏II K次取反后最大化的数组和 )

需要cur记录当前的的最大覆盖范围的下标,next记录在覆盖范围内找到的最大覆的下标盖范围count记录走的次数。如何找在当前的最大覆盖范围内的下标找到比当前覆盖范文大的或者是等于的呢,其实就是一个for然后next取的是最大的覆盖范围,然后在判断,如果当前遍历到达了当前最大的覆盖范围的下标,count+=1,因为数组长度等于1的情况已经判断了,那么无论如何都要走一步,然后把找到的最大覆盖范围赋值给当前的最大的覆盖范围的下标,然后在判断是否当前的最大覆盖范围已经超过了数组的长度,如果是,则结束循环。

2024-10-09 22:16:53 822

原创 算法工程师重生之第二十三天(理论基础 分发饼干 摆动序列 最大子序和 )

参考文献。

2024-10-08 21:39:14 646

原创 算法工程师重生之第二十二天(递增子序列 全排列 全排列 II 重新安排行程 N皇后 解数独 总结 )

所以本题应该是一个道hard题目了。除了这些难点,

2024-10-07 22:17:46 884

原创 算法工程师重生之第二十一天(复原IP地址 子集 子集II )

首先ip组成的长度,如果你使用一个临时变量存储的话,那么必须是长度为4,那么什么时候收集结果呢?当切割线到最后的时候并且临时存放的长度为4时收割。然后就是单层遍历,就判断是否合法。,其中可能包含重复元素,请你返回该数组所有可能的。,用以表示一个 IP 地址,返回所有可能的。返回的解集中,子集可以按。正好由四个整数(每个整数位于。之间组成,且不能含有前导。给定一个只包含数字的字符串。返回该数组所有可能的。,这些地址可以通过在。

2024-10-06 22:29:01 482

原创 算法工程师重生之第二十天(组合总和 组合总和II 分割回文串 )

在字符串分割问题中,你通常需要检查从某个起始索引到当前结束索引的子串,而不是从某个起始索引到整个字符串的末尾。2 和 3 可以形成一组候选,2 + 2 + 3 = 7。这可能会返回错误的结果,因为你并不关心后面的部分。:在分割字符串并检查每个子串时,通常需要判断当前子串(即从。如果至少一个数字的被选数量不同,则两种组合是不同的。的子串)是否为回文,而不是从某个索引。中的每个数字在每个组合中只能使用。7 也是一个候选, 7 = 7。到字符串末尾的部分,而不是从。对于给定的输入,保证和为。

2024-10-05 20:18:12 381

原创 算法工程师重生之第十九天(理论基础 组合 组合总和III 电话号码的字母组合)

回溯法也可以叫做回溯搜索法,它是一种搜索的方式。在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其实还隐藏着回溯 (opens new window)。回溯是递归的副产品,只要有递归就会有回溯。所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数。

2024-10-01 00:39:31 749

原创 算法工程师重生之第十八天(修剪二叉搜索树 将有序数组转换为二叉搜索树 把二叉搜索树转换为累加树 总结篇 )

参考文献给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值在中。修剪树改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

2024-09-29 00:12:37 961

原创 算法工程师重生之第十七天(二叉搜索树的最近公共祖先 二叉搜索树中的插入操作 .删除二叉搜索树中的节点)

使用前序遍历,分为5中情况,找不到,找到了,左右都为空(也子节点),左为空,右不为空,返回右不为空,意思是删除当前节点它只存在右孩子,那么就把右孩子返回,就是下面的调用是roo.left = cur,假设,现在判断的是cur是删除的点,但是它存在右孩子,那么直接把它返回是不是就把cur给去掉了,左不为空,右为空,左右都不为空,最难的是这个,我们这里的思路是把的左孩子接到右孩子的左则,这样才能更接近父节点,如何借呢?一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。

2024-09-27 22:06:19 1001

原创 算法工程师重生之第十六天(二叉搜索树的最小绝对差 二叉搜索树中的众数 二叉树的最近公共祖先 )

使用更加明确:在判断一个变量是否被赋值时,使用更加清晰,能准确表达你的意图。使用self.prev则是更通用的检查:直接使用self.prev可以用于快速判断,而不仅限于检查是否为None。使用是推荐做法,因为它确保了仅在self.prev被有效赋值后才执行相关逻辑,避免了潜在错误。迭代""""""stack.append(root) # 左中右——>右中左if cur:if cur.right: # 右stack.append(cur) # 中。

2024-09-27 00:57:06 911

原创 算法工程师重生之第十五天(最大二叉树 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树 )

如果遇到空的或者是等于val的那么就返回root节点如果root.val > val,搜索左子树,如果root.val < val,就搜索右子树,最后如果都没有搜索到,就返回NULL。- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1]。根节点的值是 5 ,但是右子节点的值是 4。

2024-09-25 20:27:05 932

原创 算法工程师重生之第十四天(找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树 )

使用层次遍历,然后取最后一层的第一个元素。不存在 sum = 5 的根节点到叶子节点的路径。由于树是空的,所以不存在根节点到叶子节点的路径。的路径,这条路径上所有节点值相加等于目标和。是同一棵树的后序遍历,请你构造并返回这颗。等于目标和的根节点到叶节点路径如上图所示。路径总和等于给定目标和的路径。(1 --> 2): 和为 3。(1 --> 3): 和为 4。,请构造二叉树并返回其根节点。假设二叉树中至少有一个节点。和一个表示目标和的整数。是指没有子节点的节点。是指没有子节点的节点。是二叉树的中序遍历,

2024-09-24 23:24:19 755

原创 算法工程师重生之第十三天(平衡二叉树 二叉树的所有路径 左叶子之和 完全二叉树的节点个数)

的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。这个函数通过栈模拟的后序遍历找每一个节点的高度(其实是通过求传入节点为根节点的最大深度来求的高度)递归:利用后序遍历,那么统计左右高度差,返回它是不是平衡 二叉树。左叶子节点,首先它是左边的,其次是叶子节点,用什么遍历都可以。在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。,返回所有从根节点到叶子节点的路径。是指没有子节点的节点。,求出该树的节点个数。

2024-09-23 21:23:06 505

原创 算法工程师重生之第十二天(翻转二叉树 对称二叉树 二叉树的最大深度 二叉树的最小深度)

参考文献给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。[2,3,1]root = [][][0, 100]递归版本,交换的是左右的指针,不是值(前序遍历和后序遍历参不多,该几行代码的位置即可)二、给你一个二叉树的根节点root, 检查它是否轴对称。truefalse[1, 1000]问题分析是否对称,那么就要左右都要相等,首相要考虑的是遍历的顺序,是前、中、后那个呢?因为你要比较左右是否相等,所以是后序。要比较的是左右的各自左右是否相等。

2024-09-21 20:49:57 861

原创 算法工程师重生之第十一天(二叉树理论基础 递归遍历 迭代遍历 统一迭代 层序遍历)

我来举一个典型的例子如题:相信不少同学最后一个二叉树是不是完全二叉树都中招了。

2024-09-21 00:00:22 1153

原创 算法工程师重生之第十天(逆波兰表达式求值 滑动窗口最大值 前 K 个高频元素 总结 )

一、给你一个字符串数组tokens,表示一个根据表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。'+''-''*''/'9该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 96该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 622该算式转化为常见的中缀算术表达式为:= 17 + 5= 22"+""-""*""/"逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。遇到运算符,那么就计算,否则加入到栈中使用eval相对较慢。

2024-09-19 23:52:53 863

原创 算法工程师重生之第九天(理论基础 用栈实现队列 用队列实现栈 有效的括号 删除字符串中的所有相邻重复项 )

但还有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了!第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false。第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。那么什么时候说明左括号和右括号全都匹配了呢,就是字符串遍历完之后,栈是空的,就说明全都匹配了。

2024-09-18 22:20:58 651

原创 算法工程师重生之第八天(翻转字符串里的单词 右旋转字符串 实现 strStr() 重复的子字符串 子符串总结 双指针回顾 )

时间复杂度是O(n)。在。

2024-09-16 23:33:38 698

原创 算法工程师重生之第七天(反转字符串 反转字符串II 替换数字)

参考文献编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须、使用 O(1) 的额外空间解决这一问题。给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。k2kkk"bacdfeg""bacd"这道题目其实也是模拟,实现题目中规定的反转规则就可以了。一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。

2024-09-14 22:21:01 839

空空如也

空空如也

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

TA关注的人

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