自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 day 66 图论part03 101.孤岛的总面积 102.沉没孤岛 103.水流问题 104.建造最大岛屿

本题使用dfs,bfs,并查集都是可以的。

2024-06-24 00:36:42 606

原创 day 65 图论part02 99.岛屿数量 深搜 99.岛屿数量 广搜 100.岛屿的最大面积

每座岛屿只能由相邻的陆地连接形成。本题思路,是用遇到一个没有遍历过的节点陆地,计数器就加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的陆地节点和海洋节点的时候直接跳过。这样计数器就是最终岛屿的数量。那么如何把节点陆地所能遍历到的陆地都标记上呢,就可以使用 DFS,BFS或者并查集。

2024-06-23 23:37:07 562

原创 day64 图论 图论理论基础 深搜 广搜 98. 所有可达路径

(其实在递归函数的参数 不容易一开始就确定了,一般是在写函数体的时候发现缺什么,参加就补什么)2.确认终止条件什么时候我们就找到一条路径了?当目前遍历的节点 为 最后一个节点 n 的时候 就找到了一条 从出发点到终止点的路径。3.处理目前搜索节点出发的路径。

2024-06-20 22:26:23 1281

原创 day63 单调栈part02 42. 接雨水 84.柱状图中最大的矩形

1.首先单调栈是按照行方向来计算雨水,如图:2.使用单调栈内元素的顺序从大到小还是从小到大呢?从栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。因为一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。3.遇到相同高度的柱子怎么办。遇到相同的元素,更新栈内下标,就是将栈里元素(旧下标)弹出,将新元素(新下标)加入栈中。例如 5 5 1 3 这种情况。

2024-06-17 22:34:55 649

原创 day62 单调栈 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II

题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。

2024-06-17 21:35:43 878

原创 part12 647. 回文子串

那么此时我们是不是能找到一种递归关系,也就是判断一个子字符串(字符串的下表范围[i,j])是否回文,依赖于,子字符串(下表范围[i + 1, j - 1])) 是否是回文。所以为了明确这种递归关系,我们的dp数组是要定义成一位二维dp数组。

2024-06-15 13:15:15 839

原创 part12 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离

4.确定遍历顺序从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];和 dp[i][j] = dp[i - 1][j];中可以看出dp[i][j]都是根据左上方和正上方推出来的。所以遍历的时候一定是从上到下,从左到右,这样保证dp[i][j]可以根据之前计算出来的数值进行计算。5.举例推导dp数组。

2024-06-15 12:42:27 1038

原创 psrt11 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列

t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1;从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的。

2024-06-15 11:18:00 830

原创 day54 动态规划 part10 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

5.举例推导dp数组。

2024-06-15 10:09:19 532

原创 day53 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

今天卖出了股票(状态三),同上分析,dp[0][2]初始化为0,dp[0][3]也初始为0。4.确定遍历顺序从递归公式上可以看出,dp[i] 依赖于 dp[i-1],所以是。

2024-06-08 16:16:38 962

原创 day52 123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV

所以第二次买入操作,初始化为:dp[0][3] = -prices[0];同理第二次卖出初始化dp[0][4] = 0;4.确定遍历顺序从递归公式其实已经可以看出,一定是。

2024-06-07 12:02:46 1020

原创 day51 动态规划 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

1.确定dp数组(dp table)以及下标的含义dp[i][0] 表示第i天持有股票所得最多现金 ,dp[i][1] 表示第i天不持有股票所得最多现金持有2.确定递推公式, 那么可以由两个状态推出来那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);, 也可以由两个状态推出来同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);

2024-06-07 10:40:17 1019

原创 day50 动态规划 198.打家劫舍 213.打家劫舍II 337.打家劫舍III

4.确定遍历顺序dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,那么一定是。

2024-06-05 03:32:19 910

原创 day49 动态规划 139.单词拆分 多重背包 背包问题总结篇

问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);动态规划:416.分割等和子集(opens new window)动态规划:1049.最后一块石头的重量 II(opens new window)动态规划:494.目标和(opens new window)动态规划:518. 零钱兑换 II(opens new window)动态规划:377.组合总和Ⅳ(opens new window)

2024-06-05 01:24:26 778

原创 day48 70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

70. 爬楼梯 (进阶)

2024-06-03 12:25:21 1001

原创 6.2 休息日 背包问题总结

就目前所遇到的01背包与完全背包作总结。

2024-06-02 12:57:06 1462

原创 day46 完全背包理论基础 518. 零钱兑换 II 377. 组合总和 Ⅳ

有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。无限个,求解将哪些物品装入背包里物品价值总和最大。01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。而完全背包的物品是可以添加多次的,所以要从小到大去遍历。

2024-06-01 14:34:01 1276

原创 day45 1049.最后一块石头的重量II 494.目标和 474.一和零

本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。本题物品的重量为stones[i],物品的价值也为stones[i]。对应着01背包里的物品重量weight[i]和 物品价值value[i]。

2024-05-31 10:42:22 892

原创 day44 01背包问题 416. 分割等和子集

背包问题背包问题。

2024-05-31 01:14:26 1030

原创 day43 343. 整数拆分 96.不同的二叉搜索树

从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。简单理解为0,1无法拆分,从2开始拆分,只初始化dp[2] = 1,从dp[i]的定义来说,拆分数字2,得到的最大乘积是1!所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]初始化,只需要初始化dp[0]就可以了,推导的基础,都是dp[0]。

2024-05-30 15:09:20 736

原创 day42 62.不同路径 63. 不同路径 II

机器人从(0 , 0) 位置出发,到(m - 1, n - 1)终点。按照动规五部曲来分析:1.确定dp数组(dp table)以及下标的含义2.确定递推公式想要求dp[i][j],只能有两个方向来推导出来,即。3.dp数组的初始化首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的,那么dp[0][j]也同理4.确定遍历顺序。

2024-05-28 13:33:48 692

原创 day41 动态规划 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

2.确定递推公式。

2024-05-28 12:19:58 514

原创 day 38 435.无重叠区间 763.划分字母区间 56. 合并区间 738.单调递增的数字 968.监控二叉树

为了使区间尽可能的重叠所以排序来使区间尽量的重叠,使用左边界排序来统计重叠区间的个数与452. 用最少数量的箭引爆气球恰好相反。

2024-05-24 19:04:40 1268

原创 day37 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

泛型参数为数组。

2024-05-23 13:45:02 440

原创 day 36 1005.K次取反后最大化的数组和 134加油站 135分发糖果

局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。因为 rating[5]与rating[4]的比较 要利用上 rating[5]与rating[6]的比较结果,所以 要从后向前遍历。如果从前向后遍历,rating[5]与rating[4]的比较 就不能用上 rating[5]与rating[6]的比较结果了。那么为什么一旦[0,i] 区间和为负数,起始位置就可以是i+1呢,i+1后面就不会出现更大的负数?

2024-05-22 11:38:38 541

原创 day35 122.买卖股票的最佳时机II

局部最优:收集每天的正利润,全局最优:求得最大利润。本题首先要清楚两点:想获得利润至少要两天为一个交易单元如果想到其实最终利润是可以分解的,那么本题就很容易了!如何分解呢?假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。此时就是把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑!跳几步

2024-05-21 00:40:39 246

原创 day34 贪心算法 455.分发饼干 376. 摆动序列

本题异常情况的本质,就是要考虑平坡i++) {count++;//在坡度变化时改变prediff这种写法解决不了单调有平坡的问题53. 最大子序和局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。全局最优:选取最大“连续和”

2024-05-20 23:40:20 1104

原创 day32 332.重新安排行程 51. N皇后 37. 解数独

由于 TreeMap 会对键进行排序,因此存储的终点城市会按照升序排序。这样,我们可以快速地找到某个起点城市可以到达的所有终点城市以及对应的机票数量。

2024-05-19 14:14:58 2109

原创 day31 491.递增子序列 46.全排列

在中我们是通过排序,再加一个标记数组来达到去重的目的。而本题求自增子序列,,排完序的数组都是自增子序列了。46.全排列。处理排列问题就不用使用startIndex了,叶子节点,就是收割结果的地方。当遇到used【i】==true时直接,因为break可能导致无法收集后面的结果。47.全排列 II。这道题目和的区别在与,要返回。。

2024-05-18 23:42:35 329

原创 day30 93.复原IP地址 78.子集 90.子集II

93.复原IP地址本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。(三个切割点)递归调用时,下一层递归的startIndex要从i+2开始(因为需要在字符串中加入了分隔符),同时记录分割符的数量pointNum 要 +1。

2024-05-18 22:18:56 256

原创 day29 39. 组合总和 40.组合总和II 131.分割回文串

在处理组合问题的时候,递归参数需要传入Index,表示下一轮递归遍历的起始位置,这个Index就是切割线。

2024-05-18 18:31:18 323

原创 day28 216.组合总和III 17.电话号码的字母组合

集合固定的就是9个数[1,...,9],所以for循环固定i<=9。

2024-05-18 16:35:56 265

原创 day27 回溯理论基础 77组合

回溯法也可以叫做回溯搜索法,它是一种暴力搜索的方式,回溯是递归的副产品,只要有递归就会有回溯。

2024-05-18 14:10:41 385

原创 day25 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

通过递归来实现删除节点的操作,在单层循环中需要考虑即使这个节点不在范围内但是他的左子树右子树任然可能在范围内,所以说遇到 的时候直接return NULL是不可行的,需要再次对子树做递归来实现修建操作。题目中说要转换为一棵高度平衡二叉搜索树。为什么强调要平衡呢?因为只要给我们一个有序数组,如果不强调平衡,都可以以线性结构来构造二叉搜索树。例如 有序数组[-10,-3,0,5,9] 就可以构造成这样的二叉搜索树,如图。其实数组构造二叉树,构成平衡树是自然而然的事情,因为大家默认都是从数组中间位置取值作

2024-05-17 19:41:07 397

原创 day24 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

利用回溯从底向上搜索,遇到一个节点的左子树里有p,右子树里有q,那么当前节点就是最近公共祖先。因为是有序树,所以 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。递归遍历顺序,本题就不涉及到 前中后序了(这里没有中节点的处理逻辑,遍历顺序无所谓了)。

2024-05-17 17:22:17 486

原创 day23 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

利用二叉搜索书的规则,中序遍历之后是一个有序数组,通过双指针可以在遍历过程中去得到结果。

2024-05-17 16:07:54 761

原创 day22 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

构造二叉树一定要使用前序遍历(中左右)先构建根节点终止条件:输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。加了if判断,为了不让空节点进入递归,遇到叶子节点就终止,因为空节点不会进入递归。允许空节点进入递归,所以没有加if判断,遇到空节点,也就是数组区间为0,就终止了。617.合并二叉树本题使用前中后序都可以但使用前序更符合常规思路。

2024-05-17 12:49:24 621

原创 day21 513.找树左下角的值 112. 路径总和 113. 路径总和ii 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

找到。

2024-05-15 14:06:54 605

原创 day20 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

平衡二叉树实际上就是判断左右子树的高度相差是否为1 ,本质上就是递归判断子树是否为平衡二叉树,如果子树不是则返回-1然后就可以得出整个二叉树不是平衡二叉树。左叶子节点并不是二叉树左侧节点所以并不能直接层序遍历。,这样才方便让父节点指向孩子节点,找到对应的路径。通过递归函数的返回值来累加求取左叶子数值之和。要求从根节点到叶子的路径,所以需要。257. 二叉树的所有路径。

2024-05-14 19:36:21 183 2

原创 day19 104.二叉树的最大深度 559.n叉树的最大深度 222.完全二叉树的节点个数 111.二叉树的最小深度

当然也可以通过层序遍历来做什么是深度与高度深度:任意节点到根节点的距离 前序遍历高度:任意节点到叶子结点的距离 后序遍历559.n叉树的最大深度同样使用后序遍历来实现也可以使用迭代(层序遍历。

2024-05-14 17:03:02 520 2

空空如也

空空如也

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

TA关注的人

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