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

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

st.empty() && heights[i] < heights[st.top()]) { // 注意是while。} else if (heights[i] == heights[st.top()]) { // 情况二。// 数组头部加入元素0。if (heights[i] > heights[st.top()]) { // 情况一。// 这个可以加,可以不加,效果一样,思路不同。// 数组尾部加入元素0。

2024-05-08 10:12:25 319

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

/ 模拟遍历两边nums,注意一下都是用i % nums.size()来操作。// 记录右边柱子的最高高度。// 记录左边柱子的最高高度。// 第一个柱子和最后一个柱子不接雨水。

2024-05-06 10:38:08 651

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

/ 根据map找到nums2[st.top()] 在 nums1中的下标。if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素。st.empty() && T[i] > T[st.top()]) { // 情况三。if (nums2[i] < nums2[st.top()]) { // 情况一。} else if (nums2[i] == nums2[st.top()]) { // 情况二。

2024-05-06 10:36:14 787

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

i--) { // 注意遍历顺序。} else if (dp[i + 1][j - 1]) { // 情况三。if (j - i <= 1) { // 情况一 和 情况二。

2024-05-06 10:30:40 349

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

public:i++) {j++) {} else {public:i++) {j++) {else {

2024-05-06 10:24:24 456

原创 代码随想录算法训练营第55天|392.判断子序列*、 115.不同的子序列*

public:i++) {j++) {public:i++) {j++) {} else {

2024-04-29 10:47:16 213

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

/ result 保存dp[i]的最大值。

2024-04-29 10:46:17 308

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

if (nums[i] > nums[i - 1]) { // 连续记录。

2024-04-29 10:44:30 271

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

力扣题目链接class Solution {public: int maxProfit(vector<int>& prices) { int n = prices.size(); if (n == 0) return 0; vector<vector<int>> dp(n, vector<int>(4, 0)); dp[0][0] -= prices[0]; // 持股票

2024-04-25 10:59:15 324

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

## 代码public:i++) {public:​j < 2 * k;j += 2) {i++) {j += 2) {

2024-04-24 10:08:04 279

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

/ 注意这里是和121. 买卖股票的最佳时机唯一不同的地方。// 直接取最大区间利润。// 取最左最小价格。

2024-04-23 10:26:48 175

原创 代码随想录算法训练营第48天| 198.打家劫舍*、 213.打家劫舍II*、337.打家劫舍 III*

/ 不偷cur,那么可以偷也可以不偷左右节点,则取较大的情况。// 偷cur,那么就不能偷左右节点。// 长度为2的数组,0:不偷,1:偷。// 198.打家劫舍的逻辑。

2024-04-22 10:14:31 776

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

/ 记录以startIndex开始的子串是不可以被拆分的。// 如果memory[startIndex]不是初始值了,直接使用memory[startIndex]的结果。// -1 表示初始化状态。

2024-04-20 09:31:11 311

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

# 70. 爬楼梯(进阶版)*

2024-04-19 10:20:56 308

原创 代码随想录算法训练营第44天| 518.零钱兑换II*、 377. 组合总和 Ⅳ*

j++) { // 遍历背包。j++) { // 遍历物品。i++) { // 遍历物品。i++) { // 遍历背包。

2024-04-18 10:11:30 270

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

力扣题目链接。

2024-04-17 11:09:59 887

原创 代码随想录算法训练营第42天|416. 分割等和子集*

j--) { // 每一个元素一定是不可重复放入,所以从大到小遍历。// 总和不会大于20000,背包最大只需要其中一半,所以10001大小就可以了。// 题目中说:每个数组中的元素不会超过 100,数组的大小不会超过 200。背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值。// 集合中的元素正好可以凑成总和target。背包如果正好装满,说明找到了总和为 sum / 2 的子集。// dp[i]中的i表示背包内总和。// 开始 01背包。背包的体积为sum / 2。

2024-04-16 13:13:26 278

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

递推公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));所以递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。有1个元素的搜索树数量就是dp[1]。

2024-04-15 10:46:49 552

原创 代码随想录算法训练营第39天| 62.不同路径、63. 不同路径 II

if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) //如果在起点或终点出现了障碍,直接返回0。从前做了,还算有印象,当前元素从上边和左边的值计算得出。加入障碍后,代码需要相应地改变。

2024-04-13 18:57:42 403

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

一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。从dp[i]的定义可以看出,dp[i] 可以有两个方向推出来。

2024-04-12 12:31:36 595

原创 代码随想录算法训练营第37天|738.单调递增的数字*、968.监控二叉树*

/ left == 1 && right == 0 左节点有摄像头,右节点无覆盖。// left == 0 && right == 1 左节点有无覆盖,右节点摄像头。// left == 1 && right == 2 左节点有摄像头,右节点有覆盖。// left == 2 && right == 1 左节点有覆盖,右节点有摄像头。// left == 0 && right == 2 左节点无覆盖,右节点覆盖。// left == 2 && right == 0 左节点覆盖,右节点无覆盖。

2024-04-11 09:59:39 810

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

/ 合并区间,只更新右边界就好,因为result.back()的左边界一定是最小值,因为我们按照左边界排序的。if (result.back()[1] >= intervals[i][0]) { // 发现重叠区间。i++) { // 统计每一个字符最后出现的位置。// i为字符,hash[i]为字符出现的最后位置。从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点。首先按照右边界排序,只要后续区间的左边界小于先前区间的右边界,即可判定为重叠。

2024-04-10 11:12:36 640

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

/ 更新重叠气球最小右边界。if (points[i][0] > points[i - 1][1]) { // 气球i和气球i-1不挨着,注意这里不是>=仔细思考一下就发现:如果把气球排序之后,从前到后遍历气球,被射过的气球仅仅跳过就行了,没有必要让气球数组remove气球,只要记录一下箭的数量就可以了。局部最优:当气球出现重叠,一起射,所用弓箭最少。else { // 气球i和气球i-1挨着。

2024-04-09 11:13:33 399

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

局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。if (curSum < 0) { // 当前累加rest[i]和 curSum一旦小于0。贪心的思路,局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大。// 起始位置更新为i+1。// curSum从0开始。

2024-04-08 11:00:54 435

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

力扣题目链接class Solution {public: int maxProfit(vector<int>& prices) { int result = 0; for (int i = 1; i < prices.size(); i++) { result += max(prices[i] - prices[i - 1], 0); } return result; }

2024-04-06 10:10:52 733

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

if (count > result) { // 取区间累计的最大值(相当于不断确定最大子序终止位置)// 注意这里,只在摆动变化的时候更新prediff。i--) { // 遍历胃口。if (index >= 0 && s[index] >= g[i]) { // 遍历饼干。注意版本一的代码中,可以看出来,是先遍历的胃口,在遍历的饼干,那么可不可以 先遍历 饼干,在遍历胃口呢?外面的 for 是里的下标 i 是固定移动的,而 if 里面的下标 index 是符合条件才移动的。// 饼干数组的下标。

2024-04-05 11:07:47 318

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

k++) { // (i, j) 这个位置放k是否合适。if (isValid(row, col, chessboard, n)) { // 验证合法就可以放。j++) { // 遍历列。if (target.second > 0 ) { // 记录到达机场是否飞过了。j++) { // 判断列里是否重复。

2024-04-05 11:05:39 345

原创 代码随想录算法训练营第29天|491.递增子序列*、 46.全排列*、 47.全排列 II*

/ path里已经收录的元素,直接跳过。// 记录这个元素在本层用过了,本层后面不能再用了。// used[i - 1] == false,说明同一树层nums[i - 1]使用过。// used[i - 1] == true,说明同一树枝nums[i - 1]使用过。// 使用set对本层元素进行去重。// 如果同一树层nums[i - 1]使用过则直接跳过。// 此时说明找到了一组。// 此时说明找到了一组。## 47.全排列 II*

2024-04-03 11:08:59 724

原创 代码随想录算法训练营第28天| 93.复原IP地址*、 78.子集*、 90.子集II*

if (isValid(s, startIndex, i)) { // 判断 [startIndex,i] 这个区间的子串是否合法。// used[i - 1] == true,说明同一树枝candidates[i - 1]使用过。pointNum--;if (s[i] > '9' || s[i] < '0') { // 遇到非数字字符不合法。if (startIndex >= nums.size()) { // 终止条件可以不加。

2024-04-02 09:58:42 625

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

## 39. 组合总和*力扣题目链接// 版本一class Solution {private: vector<vector<int>> result; vector<int> path; void backtracking(vector<int>& candidates, int target, int sum, int startIndex) { if (sum > target) {

2024-04-01 10:41:14 634

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

/ 递归,注意index+1,一下层要处理下一个数字了。// 递归,注意index+1,一下层要处理下一个数字了。// 将index指向的数字转为int。// 将index指向的数字转为int。// 取数字对应的字符集。// 回溯,撤销处理的节点。

2024-03-31 10:26:48 298

原创 代码随想录算法训练营第24天|77. 组合

/ 存放符合条件结果的集合。// 回溯,撤销处理的节点。// 回溯,撤销处理的节点。// 用来存放符合条件结果。

2024-03-29 10:56:23 180

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

如果当前节点的值在[low, high]范围内,那么需要对其左右子树进行修剪,保证左右子树中的所有节点也满足这个条件。,说明当前节点及其左子树的所有节点都不在范围内,因为在二叉搜索树中,一个节点的左子树都比该节点的值小。这里,当前节点及其左子树被舍弃,因为它们的值不在[low, high]范围内。:递归修剪左子树,确保左子树中的所有节点的值也在[low, high]范围内。:返回修剪后的当前节点,它作为新的树(或子树)的根节点。来修剪当前节点的右子树,因为可能存在符合条件的节点。来修剪当前节点的左子树。

2024-03-28 10:42:42 347 1

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

第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。// 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点。// 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点。第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点。第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点。

2024-03-27 13:57:24 763

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

/ 很关键的一步,不要忘记清空result,之前result里的元素都失效了。} else if (pre->val == cur->val) { // 与前一个节点数值相同。if (count == maxCount) { // 如果和最大值相同,放进result中。if (count > maxCount) { // 如果计数大于最大值频率。if (pre == NULL) { // 第一个节点。} else { // 与前一个节点数值不同。// 记录前一个节点。// 更新上一个节点。

2024-03-26 09:40:24 873

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

在进行左右递归前的条件判断很重要,如果没有就会出现本来右子树中有结果,左子树却提前返回了nullptr,导致题目出错的情况。// 如果t1为空,合并之后就应该是t2。// 如果t2为空,合并之后就应该是t1。// 如果t1为空,合并之后就应该是t2。// 如果t2为空,合并之后就应该是t1。// 修改了t1的数值和结构。

2024-03-25 09:51:22 741 1

原创 代码随想录算法训练营第18天| 513.找树左下角的值、 112. 路径总和、106.从中序与后序遍历序列构造二叉树

这可能是符合预期的,但值得注意,这种情况下树实际上没有“最底层最左边的值”。在你提供的代码中,目标是找到二叉树最底层最左边的值。// 递归,处理节点;// 递归,处理节点;// 后序遍历数组最后一个元素,就是当前的中间节点。if (cur->right) { // 右。if (cur->left) { // 左。

2024-03-23 10:19:36 537 1

原创 代码随想录算法训练营第17天|110.平衡二叉树、 257. 二叉树的所有路径*、 404.左叶子之和

/ 中,中为什么写在这里,因为最后一个节点也要加入到path中。:如果树是空的,按当前逻辑,函数将返回0。这可能是符合预期的,但值得注意,这种情况下树实际上没有“最底层最左边的值”。在你提供的代码中,目标是找到二叉树最底层最左边的值。代码的主要逻辑是通过递归遍历来实现的,同时跟踪当前层级。的当前值,而对它的任何修改都不会反映到其他递归调用中。通过引用传递,这样在任何递归调用中对其的修改都会反映到所有的递归调用中。if (cur->left) { // 左。if (cur->right) { // 右。

2024-03-22 09:26:19 657 1

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

# 104.二叉树的最大深度。

2024-03-21 10:51:16 312 1

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

/ 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的。que.empty()) { // 修改了这里的语法错误,添加了缺失的闭合括号。

2024-03-20 10:28:16 629 2

空空如也

空空如也

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

TA关注的人

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