自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【6.17 代随_60day】 柱状图中最大的矩形

此时大家应该可以发现其实就是栈顶和栈顶的下一个元素以及要入栈的三个元素组成了我们要求最大面积的高度和宽度。只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。所以本题单调栈的顺序正好。

2023-06-17 20:48:06 97

原创 【6.16 代随_59day】 下一个更大元素 II、接雨水

情况二:当前遍历的元素(柱子)高度等于栈顶元素的高度 height[i] == height[st.top()]情况一:当前遍历的元素(柱子)高度小于栈顶元素的高度 height[i] < height[st.top()]情况三:当前遍历的元素(柱子)高度大于栈顶元素的高度 height[i] > height[st.top()]加多一个for循环即可,和每日温度题几乎一样。分别求当前水柱 左边和右边的最大值。以下逻辑主要就是三种情况。

2023-06-16 20:26:21 91

原创 【6.15 代随_58day】 每日温度、下一个更大元素 I

使用map存放对应数值。其他解法和上一题一样。LinkedList定义栈,单调栈。

2023-06-15 09:21:22 125

原创 【6.14 代随_57day】 回文子串、最长回文子序列

如果s[i]与s[j]不相同,那么dp[i][j] = max( dp[ i + 1 ][j] , dp[i][ j - 1 ] );:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是false。整体上是两种,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。

2023-06-14 12:29:14 499

原创 【6.13 代随_56day】 两个字符串的删除操作、编辑距离

可以回顾一下,if (word1[i - 1] == word2[j - 1])的时候我们的操作 是 dp[i][j] = dp[i - 1][j - 1] 对吧。当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[i][j] = dp[i - 1][j - 1] + 1;

2023-06-13 09:58:43 483

原创 【6.12 代随_55day】判断子序列、不同的子序列

s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。即不需要考虑当前s子串和t子串的最后一位字母,所以只需要 dp[i-1][j-1]。,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,其实这里 大家可以发现和 【1143.最长公共子序列】的递推公式基本那就是一样的,区别就是 本题 如果。s[i - 1]来匹配,个数为dp[i - 1][j]。当s[i - 1] 与 t[j - 1]时,dp[i][j]可以有。

2023-06-12 08:40:12 717

原创 【6.10 代随_53day】 最长公共子序列、不相交的线、最大子数组和

如果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]相同,那么找到了一个公共元素,所以。主要就是两大情况: text1[i - 1] 与 text2[j - 1]相同(),text1[i - 1] 与 text2[j - 1]不相同(关于dp[i]的赋值。

2023-06-11 08:48:00 403

原创 【6.09 代随_52day】 最长递增子序列、最长连续递增序列、最长重复子数组

【代码】【6.09 代随_52day】 最长递增子序列、最长连续递增序列、最长重复子数组。

2023-06-09 08:24:13 384 1

原创 【6.08 代随_51day】 最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费

即:dp[i][2] = dp[i - 1][0] + prices[i];dp[i][1] 表示第i天不持有股票所得最多现金。dp[i][0] 表示第i天持有股票所得现金。昨天一定是持有股票状态(状态一),今天卖出。昨天卖出了股票(状态三)

2023-06-08 11:16:52 353

原创 【6.07 代随_50day】 买卖股票的最佳时机 III、买卖股票的最佳时机 IV

dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]操作一:第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i]和买卖III类似,将2次拓宽成k次(加for循环)即可。0:没有操作 (其实我们也可以不设置这个状态)确定dp数组以及下标的含义。一天一共就有五个状态,2:第一次不持有股票。4:第二次不持有股票。

2023-06-07 14:59:44 438

原创 6.06 代随_49day】 买卖股票的最佳时机、买卖股票的最佳时机 II

因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。

2023-06-06 07:22:50 41

原创 【6.05 代随_48day】 打家劫舍、打家劫舍 II、打家劫舍 III

注意我这里用的是"考虑",例如情况三,虽然是考虑包含尾元素,但不一定要选尾部元素!对于情况三,取nums[1] 和 nums[3]就是最大的。情况二:考虑包含首元素,不包含尾元素。情况三:考虑包含尾元素,不包含首元素。情况一:考虑不包含首尾元素。

2023-06-05 14:12:48 380

原创 背包问题总结篇

关于这几种常见的背包,其关系如下:通过这个图,可以很清晰分清这几种常见背包之间的关系。在讲解背包问题的时候,我们都是按照如下五部来逐步分析,相信大家也体会到,把这五部都搞透了,算是对动规来理解深入了。问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]); ,对应题目如下:问装满背包有几种方法:dp[j] += dp[j - nums[i]] ,对应题目如下:问背包装满最大价值:dp[j] = max(dp[j], dp[j - we

2023-06-03 08:19:46 444

原创 【6.02 代随_45day】 完全爬楼梯、零钱兑换、完全平方数

【代码】【6.02 代随_45day】 完全爬楼梯、零钱兑换、完全平方数。

2023-06-02 11:19:12 38

原创 【6.01 代随_44day】 完全背包、零钱兑换 II、组合总和 Ⅳ

如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for循环遍历物品。我们知道01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。这个简单的完全背包问题,估计就可以难住不少候选人了。一道典型的背包问题,一看到钱币数量不限,就知道这是一个完全背包。在求装满背包有几种方案的时候,遍历顺序是非常关键的。首先再回顾一下01背包的核心代码。最后,又可以出一道面试题了,就是。因为可以重复使用物品。排列数就是外层for。

2023-06-01 08:05:35 772

原创 【5.31 代随_43day】 最后一块石头的重量 II、目标和、一和零

1049. 最后一块石头的重量 II(中等)

2023-05-31 15:51:11 382

原创 【5.30 代随_42day】 二维dp数组01背包、一维dp数组01背包、分割等和子集

【代码】【5.30 代随_42day】 二维dp数组01背包、一维dp数组01背包、分割等和子集。

2023-05-30 10:23:06 44

原创 【5.29 代随_41day】 整数拆分、不同的二叉搜索树

递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});只初始化dp[2] = 1,从dp[i]的定义来说,拆分数字2,得到的最大乘积是1。,相当于是拆分 (i - j) ,对这个拆分不理解的话,可以回想dp数组的定义。其实可以从1遍历j,然后有两种渠道得到dp[i].确定dp数组(dp table)以及下标的含义。j * (i - j) 是单纯的把整数拆分为。,而 j * dp[i - j] 是拆分成。,可以得到的最大乘积为dp[i]。

2023-05-30 08:17:13 646

原创 【5.27 代随_39day】 不同路径、不同路径 II

【代码】【5.27 代随_39day】 不同路径、不同路径 II。

2023-05-29 16:49:08 42

原创 【5.26 代随_38day】 动态规划基础理论、斐波那契数、爬楼梯、使用最小花费爬楼梯

还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。那么dp[i]就是 dp[i - 1]与dp[i - 2]之和!从dp[i]的定义可以看出,dp[i] 可以有两个方向推出来。推导公式:F[n] = F[n-1] + F[n-2];dp[0]在此题没有意义。因为没有第0层,故不用初始化。确定递推公式,如何可以推出dp[i]呢?

2023-05-29 16:16:11 621

原创 【5.25 代随_37day】 单调递增的数字、监控二叉树

【代码】【5.25 代随_37day】 单调递增的数字、监控二叉树。

2023-05-25 19:14:02 157

原创 【5.24 代随_36day】 无重叠区间、划分字母区间、合并区间

寻找最远的出现位置!

2023-05-24 17:34:13 28

原创 【5.23 代随_35day】 柠檬水找零、根据身高重建队列、用最少数量的箭引爆气球

本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后再按照另一个维度重新排列。局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性。情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5。全局最优:最后都做完插入操作,整个队列满足题目队列属性。情况二:账单是10,消耗一个5,增加一个10。情况一:账单是5,直接收下。

2023-05-23 11:35:56 49

原创 【5.22 代随_34day】 K 次取反后最大化的数组和、加油站、分发糖果

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。这道题目一定是要确定一边之后,再确定另一边,例如比较每一个孩子的左边,然后再比较右边,如果两边一起考虑一定会顾此失彼。第三步:如果K还大于0,那么。

2023-05-22 11:10:30 31

原创 【5.20 代随_32day】 买卖股票的最佳时机 II、跳跃游戏、跳跃游戏 II

相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。那么根据prices可以得到每天的利润序列:(prices[i] - prices[i - 1])…假如第0天买入,第3天卖出,那么利润为:prices[3] - prices[0]。,即:移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不考虑是不是终点的情况。这道题目可能我们只会想,选一个低的买入,再选个高的卖,再选一个低的买入…

2023-05-21 11:43:56 30

原创 【5.19 代随_31day】 贪心算法、分发饼干、摆动序列、最大子数组和

局部最优就是小饼干喂给胃口小的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。插入元素就可以了,那么这道题其实就简单了。,所以只要遍历二叉搜索树,找到。做题的时候,只要想清楚。情况一:上下坡中有平坡。情况三:单调坡度有平坡。情况二:数组首尾两端。

2023-05-19 10:57:22 68

原创 【5.18 代随_30day】 重新安排行程、N 皇后、解数独

那么会直接返回, 这也就是为什么没有终止条件也不会永远填不满棋盘而无限递归下去!棋盘搜索问题可以使用回溯法暴力搜索,只不过这次我们要做的是。注意这里return false的地方,这里放。,说明这个棋盘找不到解决数独问题的解!因为如果一行一列确定下来了,这里。判断棋盘是否合法有如下。

2023-05-18 08:35:27 84

原创 【5.17 代随_29day】 递增子序列、全排列、全排列 II

这也是需要注意的点,unordered_set uset;是记录本层元素是否重复使用,新的一层uset都会重新定义(清空),所以要知道uset只负责本层!可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。首先排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。还要强调的是去重一定要对元素进行排序,这样我们才方便通过相邻的节点来判断是否重复使用了。

2023-05-17 09:11:53 36

原创 【5.13 代随_25day】 复原 IP 地址、子集、子集 II

最后就是在写一个判断段位是否是有效段位了。中已经详细讲解过了,和本题是一个套路。中就提到切割问题类似组合问题。

2023-05-16 09:41:56 28

原创 【5.15 代随_27day】 组合总和、组合总和 II、分割回文串

本题是 集合里元素可以用无数次,那么和组合问题的差别 其实仅在于 startIndex上的控制。切割问题的回溯搜索的过程和组合问题的回溯搜索的过程是差不多的。来看看在递归循环中如何截取子串呢?本题开始涉及到一个问题了:去重。

2023-05-15 09:13:35 29

原创 【5.13 代随_25day】 组合总和 III、电话号码的字母组合

【代码】【5.13 代随_25day】 组合总和 III、电话号码的字母组合。

2023-05-13 21:50:46 33

原创 【5.12 代随_24day】 回溯算法、组合

举个例子,n = 4,k = 3, 目前已经选取的元素为0(path.size为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。为什么有个 +1 呢,因为包括起始位置,我们要是一个左闭的集合。从2开始搜索都是合理的,可以是组合[2, 3, 4]。回溯是递归的副产品,只要有递归就会有回溯。,所有回溯法的问题都可以抽象为树形结构!回溯法解决的问题都可以抽象为。

2023-05-12 14:54:22 31

原创 【5.11 代随_23day】 修剪二叉搜索树、将有序数组转换为二叉搜索树、把二叉搜索树转换为累加树

所以我们需要反中序遍历这个二叉树,然后。从树中可以看出累加的顺序是。

2023-05-11 11:07:28 32

原创 【5.10 代随_22day】 二叉搜索树的最近公共祖先、二叉搜索树中的插入操作、删除二叉搜索树中的节点

利用二叉搜索树的性质,只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是q 和 p的公共祖先。且一定是最近公共祖先。搜索树的节点删除要比节点增加复杂的多,有很多情况需要考虑。插入元素就可以了,那么这道题其实就简单了。,所以只要遍历二叉搜索树,找到。

2023-05-10 10:17:51 36

原创 【5.09 代随_21day】 二叉搜索树的最小绝对差、二叉搜索树中的众数、二叉树的最近公共祖先

(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。既然是搜索树,它中序遍历就是有序的。

2023-05-09 10:00:31 142

原创 【5.08 代随_20day】 最大二叉树、合并二叉树、二叉搜索树中的搜索、验证二叉搜索树

中一样的优化思路,就是每次分隔不用定义新的数组,而是通过下标索引直接在原数组上操作。,因为先构造中间节点,然后递归构造左子树和右子树。,因为节点的有序性就帮我们确定了搜索的方向。,输出的二叉搜索树节点的数值是有序序列。,即可递归遍历的过程中直接判断是否有序。每次递归均需要找最大值的索引。

2023-05-08 15:51:46 27

原创 【5.06 代随_18day】 找树左下角的值、路径总和、从中序与后序遍历序列构造二叉树

第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点。本题使用层序遍历再合适不过了,比递归要好理解得多!第五步:切割后序数组,切成后序左数组和后序右数组。如果使用递归法,如何判断是最后一行呢,其实就是。第一步:如果数组大小为零的话,说明是空节点了。,每次后序数组最后一个元素就是节点元素。以 后序数组的最后一个元素为切割点,中序数组,根据中序数组,反过来。

2023-05-06 08:29:57 20

原创 【5.05 代随_17day】 平衡二叉树、二叉树的所有路径、左叶子之和

二叉树深度 和 二叉树高度的差异,求深度适合用前序遍历,而求高度适合用后序遍历。

2023-05-05 09:57:08 27

原创 【5.04 代随_16day】 二叉树的最大深度、二叉树的最小深度、完全二叉树的节点个数

判断其子树是不是满二叉树,不是就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。

2023-05-04 21:59:05 19

原创 【5.03 代随_15day】 二叉树的层序遍历、翻转二叉树、对称二叉树

通过队列来判断根节点的左子树和右子树的内侧和外侧是否相等。使用两棵树,leftTree和rightTree。

2023-05-03 21:46:11 54

空空如也

空空如也

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

TA关注的人

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