自定义博客皮肤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)
  • 收藏
  • 关注

原创 代码随想录算法训练营第六十天|84.柱状图中最大的矩形

要在直方图中找的最大的矩形, 那么必然是有至少一个柱子是被占满了的。例如 [2, 1, 5, 6, 2, 3 ], 第一个柱子被占满的最大面积是 2 * 1 = 2 (因为左边第一个比他小的下标在 -1, 右边第一个比他小的下标是1, 所以最大宽度是1, 最大高度是2), 第二个是 1 * 6 = 6, 第三个 5 * 2 =10, 第四个 6*1 = 6. 然后这个文件就被转化成了找到给个元素左边和右边第一个小于它的元素。如果没有, 左边的记为 -1, 右边的 len(heights) 方便处理。

2024-03-28 00:13:44 278

原创 代码随想录算法训练营第五十九天|503.下一个更大元素II 42. 接雨水

但是单调栈的思路就不一样了, 它的拆分方式时横向拆分, 当我们要推出一个元素时, 它右边的高度是将要推入的元素, 左边的高度是推出栈顶的元素的高度, 然后取最小值计算高度差, 宽度时推入元素 和 栈顶元素下标 的差值-1。以 [4, 2,0, 3, 2, 5] 为例, 前三个没有计算直接推入, st = [4, 2, 0] 当第三个元素被推入时, 首先被推出的0, 对的高度是 min(2, 3) - 0 =2, 宽度是1. 那先算这个小长方形面积。503.下一个更大元素II。503.下一个更大元素II。

2024-03-27 14:23:56 182

原创 代码随想录算法训练营第五十八天|739. 每日温度, 496.下一个更大元素 I

思路:本题是单调栈的一个经典应用, 单调栈是循环数组时, 不停的把元素推入栈中, 同时如果需要, 推出栈中的元素, 保持栈的单调性。单调栈可以是递增或者递减的。递增栈中, 栈顶的元素是最小的 (先入后出) 例如数组 [5, 3,4,1] 单调递增栈中的元素 i = 0, st = [5], i=1 st=[5, 3], i = 2 st = [5, 4] (推出3)。

2024-03-27 14:09:27 309

原创 代码随想录算法训练营第五十七天|647 回文子串 516.最长回文子序列

思路: 当我们看到两个下标 i, j 上 s[i]!= s[j], 那么 s[i: j+1] 一定不是回文子串。如果s[i] == s[j], 那么我们可以在检查 s[i+1: j] 是不是回文串。如果暴力搜索的话是 O(n^3) 的时间复杂度。我们可以用一个二维 dp 数组记录s[i: j+1] 是不是回文串。然后用 一个 visited 数组记录我们是不是已经经历过 i,j 的组合。

2024-03-25 14:33:03 376

原创 代码随想录算法训练营第五十五天| 583. 两个字符串的删除操作,72. 编辑距离

思路: 判断两个字符串最少经过多少步的删除操作可以相等。dp 数组记录的是w1[0:i] 和 w2[0:j] 的最少路径。初始化的时候记得dp的 0下标表示的是空字符串。所以 dp[0][j] = j, dp[i][0] = i.递推关系可以想到 如果w1[j-1] == w2[i-1], 那么最下路径就是 dp[i][j] = dp[i-1][j-1]. 麻烦点的是不相等的情况。

2024-03-24 21:10:54 160

原创 代码随想录算法训练营第五十四天|392.判断子序列, 115.不同的子序列

思路:第一种方法使用动态规划, 也就是寻找最长公共字符串, 如果最长公共字符串等于s的长度, 输出 True, 反之输出False。第二张方法使用双指针, 在外层循环字符串s, 然后内层开始找到s[0] 的位置。如果能找到, 例如位置是 j0, 然后开始从 t[j0:] 找 s[1], 位置是 j1, .... 如果没有找到的字符, 返回 False, 否则返回 True。难点: 无。

2024-03-24 20:55:53 267

原创 代码随想录算法训练营第五十三天|1143.最长公共子序列 1035.不相交的线 53. 最大子序和

思路: longest common subsequence 是动态规划中的经典问题。记住 如果 str1[i] == str2[j] dp[i+1][j+1]= dp[i][j] + 1, 不等的话 dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j]).难点: 无。

2024-03-21 12:55:23 184

原创 代码随想录算法训练营第五十二天|300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

思路: 动态规划的想法是用一个一维数组记录数组到每个下标时候的最大递增序列的长度,然后外层循环数组, 再数组下标为 i 时, 循环dp数组从 0-i-1. 如果nums[i] > nums[j], 那么dp[i] = max(dp[j] + 1, dp[i]) 否则,dp[i] = max(dp[j], dp[i]).更快速的方法使用二分搜索, 用一个list 记录前面出现过的到每个长度的“最优解”。

2024-03-20 13:35:09 311

原创 代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期 , 714.买卖股票的最佳时机含手续费

难点: 如果第一次碰到可能不太能想到用二维数组区分状态。思路: 和上一题一样, 只是递推关系稍微变了一点。

2024-03-18 23:23:48 304

原创 代码随想录算法训练营第50天|123.买卖股票的最佳时机III, 188.买卖股票的最佳时机IV

思路: 和之前一样, 数组表示股票价格, 要求最大收益, 但是复杂在了可以交易两次。我最初的思路是在 i 天先求0-i 天买卖一次的最大收益, 再求 i - 最后一天交易一次的最大收益。时间复杂度也是 O(n)。不过看了讲解的一般方法是填一个2维dp数组, 数组的 row 表示第 i 天, column 表示操作, 例如column 0 表示不操作, column 1 表示第一次持有, column2 表示第一次不持有。。。

2024-03-18 13:41:54 283

原创 代码随想录算法训练营第四十八天|121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

思路: dp 数组记录的是持有到 第 i 天收益或者压根儿不买入到第i天的收益, dp[0] = 0. dp[i] = max(dp[i-1] + p[i] - p[i-1], 0). 注意最后不要返回dp[-1], 因为不是必须持有到最后一天的, 返回 max(dp). 当然更简单的做法是循环数组记录minium, max_profit = max(max_profit, nums[i]-minimum).难点: 无。

2024-03-16 17:29:42 212

原创 代码随想录算法训练营第四十七天|198.打家劫舍, 213.打家劫舍II , 337.打家劫舍III

今天练习三个打劫问题, 最后一个相对比较难想到的, 思路巧妙

2024-03-16 17:17:32 518

原创 代码随想录算法训练营第四十六天|139.单词拆分

dp[0] 要初始化成 1. 然后考虑到这个问题是排列问题, 例如 字符串‘leetcode’ 列表['code', 'leet']. 所以应该先循环背包容量再循环数组。如果 str[i-len(substr) :i] == substr, 并且 dp[i-len(substr)] 都是true 的时候, dp[i] = True. 或者 如果原本 dp[i] = True了, 就不要再往下循环数组了 (表示已经fit了)。难点:递归的逻辑比较难想, 要考虑原本dp[i] = True 的情况。

2024-03-16 16:53:24 239

原创 代码随想录算法训练营第四十五天|70. 爬楼梯 (进阶)322. 零钱兑换,279.完全平方数

练习三个完全背包问题, 求打包满的方法, 求打包满需要的最少元素。

2024-03-13 14:45:39 164

原创 代码随想录算法训练营第四十四天|完全背包,518. 零钱兑换 II , 377. 组合总和 Ⅳ

完全背包问题的理解, 完全背包问题和01 背包要区分清楚。

2024-03-13 13:38:38 241

原创 代码随想录算法训练营第四十三天|1049. 最后一块石头的重量 II, 494. 目标和,474.一和零

今天继续01背包问题的练习, 这些问题其实都不是很直接的考察01背包, 需要一定的思路去转化问题。

2024-03-13 01:38:17 478

原创 代码随想录算法训练题第四十一天|背包问题, 416. 分割等和子集

背包问题

2024-03-09 18:10:49 71

原创 代码随想录算法训练营第四十天|343. 整数拆分, 96.不同的二叉搜索树

动态规划, 更为复杂的递推关系

2024-03-09 17:49:41 193

原创 代码随想录算法训练营第三十九天|62.不同路径, 63. 不同路径 II

二维的动态规划问题, 机器人的路径

2024-03-09 17:30:30 225

原创 代码随想录算法训练营第三十八天|509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

今天开始练习动态规划问题, 动态规划是算法中很重要的一项。 我的理解是动态规划问题是通过之前的状态推导出当前状态的一类问题, 他原则上可以通过 DAQ 算法实现, 但是对比DAQ算法牺牲了空间来换取时间。

2024-03-06 17:06:02 308

原创 代码随想录算法训练营第三十七天| 738.单调递增的数字 , 968.监控二叉树 (跳过)

今天有最后两个贪心算法的训练题, 其中最后一个问题比较难, 这次就先跳过了。 另外有文档回顾贪心算法。

2024-03-06 16:14:46 132

原创 代码随想录算法训练营第三十六天|435. 无重叠区间, 763.划分字母区间, 56. 合并区间

今天继续练习greedy 算法, 练习了和区间的交集并集相关问题, 这种问题上了可以先考虑sorting 之后再处理。

2024-03-04 22:18:29 325

原创 代码随想录算法训练营第三十四天| 860.柠檬水找零, 406.根据身高重建队列 ,452. 用最少数量的箭引爆气球

今天继续练习贪心算法, 有个问题比较难的。

2024-03-04 17:16:06 315

原创 代码随想录算法训练营第三十三天|1005.K次取反后最大化的数组和 , 134. 加油站, 135. 分发糖果

思路: 这个问题比较简单, 其实就是每次都反转最小的数字就可以了, 可以通过对数组排序, 然后先从小到大反转一个负数,然后下标前移,如果当前下标不是负数了, 但还有反转次数, 就比较当前下标i 和 i-1 的数字那个更小, 哪个更小就反复反转哪一个。这里可以用个小技巧, 给数组append 一个正无穷的数字,避免数组全是负数的情况。还有更直接的方法使用优先队列。难点: 无。

2024-02-29 23:33:48 123

原创 代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II , 55. 跳跃游戏 , 45. 跳跃游戏 II

今天继续三个贪心算法的练习题。

2024-02-29 23:16:16 174

原创 代码随想录算法训练营第三十一天|455.分发饼干 , 376. 摆动序列,53. 最大子序和

今天开始进行 greedy 算法的练习, greedy 算法没有特定的模版。 要自己多体验。

2024-02-28 00:07:39 170

原创 代码随想录算法训练营第三十天|332.重新安排行程, 51. N皇后, 37. 解数独

今天继续练习backtrack算法, 今天的练习题有棋盘问题, 比较难的。

2024-02-27 17:20:48 283

原创 代码随想录算法训练营第二十九天|491.递增子序列 , 46.全排列 , 47.全排列 II

使用backtrace算法练习排列和子集问题

2024-02-27 02:14:55 234

原创 代码随想录第二十七天|93.复原IP地址 , 78.子集 , 90.子集II

今天继续练习回溯算法, 有一个分割问题和两个排序问题。

2024-02-25 16:51:33 129

原创 代码随想录算法训练营第二十六天|39. 组合总和 , 40.组合总和II , 131.分割回文串

backtracking 算法第三天,涉及的练习题包括组合和分割

2024-02-23 15:32:59 191

原创 代码随想录算法训练营第二十五天|216.组合总和III , 17.电话号码的字母组合

今天的内容是两个使用 backtraking 的leetcode 练习题。

2024-02-21 21:50:44 169

原创 代码随想录算法训练营第二十四天|回溯算法, 77 组合

思路: 找到一个从1-n的list中所有的 k 个元素的组合。容易想到, 如果k=1, 那么输出这个list 中的元素组成的二维list, 如果 k = n 返回 [input_list], 如果 k > n 返回空。如果k > 1 呢?那么可以先抽出 1, 然后在 2-n 中找出 k-1 的组合, 再把1 加进去, 然后抽出2, 然后在 3-n 中找出 k-1 的组合, 再把2加进去。难点: 退出迭代的条件。

2024-02-21 00:45:26 203

原创 代码随想录算法训练营第二十三天|669. 修剪二叉搜索树 , 108.将有序数组转换为二叉搜索树 , 538.把二叉搜索树转换为累加树

思路: 根据BST 的性质, 如果root的值大于high, 那么应该舍弃root 和root右边的 node, 并往下迭代修建root 左边的subtree。同理处理 root值小于low的情况。如果root 是空的,返回None。如果root 在[low, high] 这个区间, 那么root.left = 修剪后的 root.left, root.right = 修剪后的 root.right。难点: 无。

2024-02-20 01:59:21 189

原创 代码随想录算法训练营第二十二期|235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作, 450.删除二叉搜索树中的节点

思路: 本题比直接找二叉树的最近公共祖先更容易, 可以利用二叉树的性质。node 左边的值都小于node, node 右边的值都大于node。指针从 root 开始, 如果两个值都小于node, 指针往左移动, 反之往右移动。如果 node 的值恰好等于其中一个值,或者node值介于两个值中间, 输出该node。难点: 无。

2024-02-19 14:48:30 159 1

原创 代码随想录算法训练营第二十天|530.二叉搜索树的最小绝对差 , 501.二叉搜索树中的众数 , 236. 二叉树的最近公共祖先

思路:简单的想可以通过中序遍历BST,得到一个sorted array. 然后找到sorted array 中两个相邻元素的最小值。另外一个思路是当我们前序遍历到一个node 的时候, 我们知道比它的取值范围。例如 root = 2, root.left 在 [-inf, 2), root.right 在(2, inf) 之间, 可以遍历所有node, 找出node 值两个边界值最近的。还有一种方法是可以在BST中使用双指针法。通过中序遍历从 比较cur_node 和 pre_node 的差值。

2024-02-18 01:00:20 159

原创 代码随想录算法训练营第十九天|654.最大二叉树 ,617.合并二叉树 , 700.二叉搜索树中的搜索,98.验证二叉搜索树

思路: 这个问题比较直接, 按照题目的逻辑, 通过迭代法去构造就行了。难点: 无。

2024-02-16 11:13:21 177 1

原创 代码随想录算法训练营第十八天|513.找树左下角的值,112. 113 路径总和,106. 105 构造二叉树

思路:本题要找出二叉树最下面一层最左边的值, 一眼看过去就是用层序遍历。每一层的循环从左往右,开头的元素记录下来, 最后输出最后一层开头元素。难点: 无。

2024-02-15 13:50:35 355 1

原创 代码随想录算法训练营第十七天|110.平衡二叉树, 257. 二叉树的所有路径, 404.左叶子之和 (优先掌握递归)

思路:本题要求判断一棵树是否是平衡二叉树, 平衡二叉树的定义是对于所有node左subtree 的高度 - 右subtree 高度的绝对值不能大于1. 求一个node 的高度可以用递归法, 1 + max(height(node.left), height(node.right))。这里因为需要对所有的node判断, 要求所有node 的高度, 包含了大量的重复遍历, 因此我这里通过一次遍历, 把node 的高度赋值给node的 val. 这样可以简化复杂度。

2024-02-14 11:39:06 314 1

原创 代码随想录算法训练营第十六天|104.二叉树的最大深度,111.二叉树的最小深度, 222.完全二叉树的节点个数

今天继续练习二叉树。

2024-02-08 12:53:45 106

原创 代码随想录算法训练营第十五天|层序遍历 , 226.翻转二叉树, 101.对称二叉树

思路: 直接用递归就行了。

2024-02-07 17:00:40 205 1

空空如也

空空如也

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

TA关注的人

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