自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 股票专题:121. 买卖股票的最佳时机;122. 买卖股票的最佳时机 II;123. 买卖股票的最佳时机 III;309. 最佳买卖股票时机含冷冻期:

所以:dp[i][0] = max(dp[i - 1][0] + prices[i], dp[i - 1][1])所以:dp[i][0] = max(dp[i - 1][0] + prices[i], dp[i - 1][1])所以:dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] -prices[i])所以:dp[i][0] = max(dp[i - 1][0],-prices[i])第i-1天就不持有股票,那么就保持现状, 即:dp[i - 1][1]

2023-06-06 20:24:09 548

原创 day 48 打家劫舍专题:198. 打家劫舍;213. 打家劫舍 II;337. 打家劫舍 III

dp数组(dp table)以及下标的含义:下标为0记录不偷该节点所得到的的最大金钱,下标为1记录偷该节点所得到的的最大金钱。这里我们要求一个节点 偷与不偷的两个状态所得到的金钱,那么返回值就是一个长度为2的数组。dp[i] : 考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]dp[i] : 考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]在遍历的过程中,如果遇到空节点的话,很明显,无论偷还是不偷都是0,所以就返回。偷第i间:dp[i] = dp[i - 2] +nums[i]

2023-06-05 22:30:05 390

原创 day 46: 背包总结

对应题目如下:动态规划:416.分割等和子集 (opens new window)动态规划:1049.最后一块石头的重量 II (opens new window)

2023-06-03 19:29:19 329

原创 day 45:爬楼梯进阶版;322. 零钱兑换;279. 完全平方数

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 一步一个台阶,两个台阶,三个台阶,…,直到 m个台阶。问有多少种不同的方法可以爬到楼顶呢?

2023-06-03 17:57:56 368

原创 day 44 完全背包:518. 零钱兑换 II;377. 组合总和 Ⅳ

已经有一个2(coins[i]) 的话,有 dp[2] = dp[1] + dp[0]种方法(3种) 凑成 总金额为5的背包。已经有一个5 (coins[i])的话,有 dp[5]= dp[2]+ dp[1]+ dp[0].(4种)2111/221/11111/5。已经有一个1(coins[i]) 的话,有 dp[1]= dp[0]种方法(1种) 凑成 总金额为5的背包。递推公式:dp[j] += dp[j - coins[i]];递推公式:dp[j] += dp[j - coins[i]];

2023-06-02 11:30:03 651

原创 day43:1049. 最后一块石头的重量 II; 474. 一和零; 494.目标和:有多少种方式装满背包

首先,本题要求集合里能否出现总和为 sum / 2 的子集。

2023-06-01 09:45:43 501

原创 day 42:01背包问题;416. 分割等和子集

因为:递归公式中可以看出dp[i][j]是靠dp[i-1][j]和dp[i - 1][j - weight[i]]推导出来的。放物品 i : 不放物品 i 时的最大价值加上放物品 i 的价值 :dp[j - weight[ i ]] + value[ i ];因为对于二维dp,dp[i][j]都是通过上一层即dp[i - 1][j]计算而来,本层的dp[i][j]并不会被覆盖!不放物品i :dp[j]可以由dp[j - weight[i]]推出,当前背包容量为 j ,二维dp可以先遍历物品也可先遍历背包。

2023-05-31 20:32:59 464

原创 day 41:343. 整数拆分;96.不同的二叉搜索树

首先一定是遍历节点数,从递归公式:dp[i] += dp[j - 1] * dp[i - j]可以看出,节点数为i的状态是依靠 i之前节点数的状态。所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。元素3为头结点搜索树的数量 =左子树有2个元素的数量*右子树有0个元素的数量。dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。

2023-05-30 10:43:09 352

原创 day 39:62. 不同路径63. 不同路径 II

与上一题不同i ++) {j ++) {inti ++) {j ++) {

2023-05-29 20:58:21 921

原创 day 38,509. 斐波那契数70. 爬楼梯;# 746. 使用最小花费爬楼梯

3楼:1+2种,三楼可以从二楼爬一层到达,也可以从一楼爬两层到达,只于前两层楼梯有关。dp[i]的定义为:第i个数的斐波那契数值是dp[i]爬到第i层楼梯,有dp[i]种方法。

2023-05-29 16:25:28 669

原创 738.单调递增的数字;968.监控二叉树

举例,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。2.此时,大体思路就是从低到上,先给叶子节点父节点放个摄像头,然后隔两个节点放一个摄像头,直至到二叉树头结点。1.摄像头都没有放在叶子节点上:摄像头可以覆盖上中下三层,如果把摄像头放在叶子节点上,就浪费的一层的覆盖。最后代码实现的时候,也需要一些技巧,例如用一个flag来标记从哪里开始赋值9。4.状态转移公式,不要和动态规划里面的状态转移公式混淆。3难点:二叉树的遍历用后序遍历。

2023-05-29 15:34:04 658

原创 day36:435. 无重叠区间;763. 划分字母区间;56. 合并区间

2.从头遍历字符,并更新字符最远下标,如果找到字符最远位置下标喝当前下标相等,则找到了分割点。1.统计每一个字符最后出现的位置。

2023-05-25 22:04:35 40

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

3.考虑是否多个气球重叠,更新i右边界,point[i][1]=min(point[i][1],point[i-1][1])1.如果i的左边界大于i-1的右边界,则气球不重叠,要用弓箭point[i][1]<point[i-1][0]2.重叠:i的左边界小于等于i-1的右边界point[i][0]>=point[i-1][0],2.为了让气球重叠,对数组进行排序:可以按其实位置排序,从前往后遍历数组,靠左尽可能让气球重复。1.按照身高降序排列,相同身高k小的排前面。2.排完序,进行插入操作。

2023-05-25 19:54:54 25

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

情况二:rest[i] = gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。情况三:如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能把这个负数填平,能把这个负数填平的节点就是出发节点。情况一:如果gas的总和小于cost总和,那么无论从哪里出发,一定是跑不了一圈的。如果跑了一圈,中途没有断油,而且最后油量大于等于0,说明这个起点是ok的。第二步:从前向后遍历,遇到负数将其变为正数,同时K–

2023-05-24 22:17:07 102

原创 day 32:122.买卖股票的最佳时机 II;55. 跳跃游戏;45. 跳跃游戏 II

需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。

2023-05-21 19:56:39 38

原创 day31: # 53. 最大子数组和;376. 摆动序列;# 455. 分发饼干

在计算是否有峰值的时候,大家知道遍历的下标 i ,计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果prediff < 0 && curdiff > 0 或者 prediff > 0 && curdiff < 0 此时就有波动就需要统计。局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。情况三:单调坡中有平坡,把要求我们只是在摆动时更新峰值。情况一:上下坡中有平坡。

2023-05-21 19:00:15 37

原创 day 30:51. N皇后;37. 解数独

定义全局变量二维数组result来记录最终结果。遍历到最后一行收结果。

2023-05-20 17:02:36 39

原创 day29:491.递增子序列;46.全排列;47 全排列2

本题其实类似求子集问题,也是要遍历树形结构找每一个节点,所以和回溯算法:求子集问题!样,可以不加终止条件,startIndex每次都会加1,并不会无限递归。90题,通过排序,和标记数组达到去重目的,但是这道题不能排序,求自增子序列,用一个非递增数组来举例。定义unorder_set uset;给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。当前取的数如果小于子集里面最右边的数,这个分支不要。数组中的整数范围是 [-100,100]。需要startinde调整下一次位置。

2023-05-20 13:58:44 45

原创 day28 93.复原IP地址;78:子集;90. 子集 II

例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。递归调用时,下一层递归的startIndex要从i+2开始(因为需要在字符串中加入了分隔符.),同时记录分割符的数量pointNum 要 +1。定义 result为全局变量,本题还需要startIndex来控制for循环的起始位置,本题还需要变量pointnum,记录添加逗号的数量。

2023-05-16 13:19:25 81

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

如果candidates[i] == candidates[i - 1] 并且 used[i - 1] == false,就说明:前一个树枝,使用了candidates[i - 1],也就是说同一树层使用过candidates[i - 1]。1.如果已经知道下一层的sum会大于target,就没有必要进入下一层递归了.对总集合排序之后,如果下一层的sum(就是本层的 sum + candidates[i])已经大于target,就可以结束本轮for循环的遍历。找出所有相加之和为 target的 组合。

2023-05-15 22:26:42 83

原创 day 25 :216.组合总和III;17. 电话号码的字母组合

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。path.size()==k以及找到和为目标值的所以路径。4.startindex下一层for循环搜索的起始位置。3.sum已经收集的元素总和,path里面元素总和。依然定义path 和 result为全局变量。1.val目标和,也等于题目中给的n。

2023-05-13 16:30:56 199

原创 day24:回溯理论;77. 组合

它是一种搜索的方式回溯是递归的副产品,只要有递归就会有回溯。

2023-05-13 13:15:38 27

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

这里写目录标题669. 修剪二叉搜索树思路1.递归1.确定递归函数的参数以及返回值2.确定终止条件3.确定单层递归的逻辑迭代669. 修剪二叉搜索树思路1.递归1.确定递归函数的参数以及返回值2.确定终止条件3.确定单层递归的逻辑迭代669. 修剪二叉搜索树思路1.递归1.确定递归函数的参数以及返回值2.确定终止条件3.确定单层递归的逻辑迭代669. 修剪二叉搜索树思路1.递归1.确定递归函数的参数以及返回值2.确定终止条件3.确定单层递归的逻辑迭代669. 修剪二叉搜索树思路1.递

2023-05-12 21:45:05 64

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

因为是有序树,所有 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。如果从节点5向左遍历,向右遍历就会出错,因为3和8也是[1,9]区间的,记录第一次出现在区间的值是最近公共祖先。1.遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是q 和 p的公共祖先,1.确认递归返回值和参数。1.确认递归返回值和参数。1.确认递归返回值和参数。3.确认单层递归逻辑。

2023-05-12 16:15:30 63

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

题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值。注意是二叉搜索树,二叉搜索树可是有序的。

2023-05-12 10:48:08 62

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

构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。注意终止条件为left>=right时,返回nullprt。优化解法:代入下标递归,数组不变。1.确定递归函数的参数和返回值。

2023-05-11 14:57:48 27

原创 day 18:513.找树左下角的值 112:路径总和;106:从中序和后序中构造二叉树

切割点在后序数组的最后一个元素,就是用这个元素来切割中序数组的,所以必要先切割中序数组。中序数组相对比较好切,找到切割点(后序数组的最后一个元素)在中序数组的位置,然后切割,左闭右开的原则。当遇到叶子节点的时候,就需要统计一下最大的深度了,所以需要遇到叶子节点来更新最大深度。第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)递归函数是有返回值的,如果递归函数返回true,说明找到了合适的路径,应该立刻返回。第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点。

2023-05-07 18:44:56 56

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

110.平衡二叉树在这道题目中将第一次涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。

2023-05-07 17:48:01 27

原创 day 16:104.二叉树的最大深度;111. 二叉树的最小深度;222完全二叉树

反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。最后如果左右子树都不为空,返回左右子树深度最小值 + 1。1.什么是二叉树的深度:从根节点到该节点的最长路径边的条数或者节点数(根节点一般为1),前序遍历。:最小深度是从根节点到最近叶子节点(没有子节点的节点)的最短路径上的节点数量。所以,如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。如果这么求的话,没有左孩子的分支会算为最短深度。而根节点的高度就是二叉树的最大深度。111.求二叉数的最小深度。

2023-05-04 21:56:38 62

原创 刷题第15天 101对称二叉树;226.翻转二叉树;二叉树的层序遍历

循环弹出队列的前两个元素(最开始为根节点的左右节点),判断是否相等,判断条件与递归类似;相等则输入左节点的左子节点,右节点的右子节点,左节点的右子节点,右节点的左子节点。再弹出队列元素7,将7的左右孩子5,8加入队列,更新队列size为4。2.根据queue size弹出队列一个元素6,作为遍历第一层的结果,然后将6的左右孩子4,7分别加入到队列,记录当前size为2;​​​​​​​​​​左节点为空,右节点不为空,不对称,return false。比较内测是否对称,传入左节点的右孩子,右节点的左孩子。

2023-05-04 00:09:19 17

原创 二叉树的遍历

2.如果当前访问的叶子节点的左节点为空弹出元素,所以弹出1,把1加入数组进行处理;处理元素1的右节点发现空所以弹出栈里的元素4,4加入到数组处理。4.处理新加入的元素2的左孩子,发现为空弹出2;处理2 的右孩子为空,弹出栈里的元素5,5的右孩子不为空把6加入。在使用迭代法写中序遍历,就需要借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素。3.处理元素4,发现4的右孩子不为空,用栈记录我们遍历过的元素2。2.把父节点的右孩子,再加左孩子。3.弹出4,再处理4的左右孩子。1.一路向左,加入左节点,

2023-05-02 17:48:21 21

原创 二叉树理论基础

int val;} }

2023-05-02 15:07:17 16

原创 day 13 239. 滑动窗口最大值 347. 前 K 个高频元素

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。2.遍历数组,在队列放入当前遍历到的元素,如当前元素大于队列尾部元素则把小于当前元素的值都弹出。1.用一个单调队列队列维护当前窗口最大值和同时保证队列里面元素由大到小排列。2.将map里的数放入vector数组,通过sort用value进行排序。1.将数组里的元素存放在map里,value存放元素出现的次数。返回 滑动窗口中的最大值。

2023-05-01 21:53:13 86

原创 day11.# 150. 逆波兰表达式求值;20. 有效的括号;1047. 删除字符串中的所有相邻重复项

1.string对象初始化为指向的字符串2.创建一个包含 n 个元素的 string 对象,其中每个元素都被初始化为字符 c3.将一个 string 对象初始化为 string 对象 str(复制构造函数)4.创建一个默认的 string 对象,长度为 05.使用C语言风格字符串处理string对象。

2023-04-30 18:31:34 33

原创 day10 225.用队列实现栈;232.用栈实现队列

队列是先进先出,栈是先进后出2.队列和栈都不是容器,而是容器适配器;栈提供push和pop接口,栈不提供访问功能没有迭代器3.栈的底层可以是vector,deque,list;队列底层以deque为缺省情况的底层结构。

2023-04-28 15:16:11 48

原创 day 8:344.反转字符串;541反转字符串2;剑指 Offer 05 替换空格剑指 Offer 58 - II. 左旋转字符串;151反转字符串中的单词

双指针分别 从头尾开始向中间移动,交换两个指针指向的数值。

2023-04-26 17:29:02 159

原创 刷题第七天:383.赎金信;454.四数相加;15三数之和;18四数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0?2.依次找abc 使得a + b +c =0,我们这里相当于 a = nums[i],b = nums[left],c = nums[right]。( nums[i] 与 nums[i + 1]),则会排除掉(-1,-1,2),不能有重复三元组但是三元组内部可以重复。满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]1. 数组排序从小到大排序,用。

2023-04-25 22:23:38 258

原创 刷题第六天:1.两数之和;202.快乐数;349. 两个数组的交集;242.有效的字母异位词

set容器,map容器,哈希表

2023-04-24 18:49:11 419

原创 刷题第四天:24.两两交换链表中的节点;19.删除链表的倒数第N个节点;160.链表相交;141,142.环形链表

2.相遇时slow走了x+y,fast走了x+y+n(y+z),fast可能在环里面绕圈,fast=2*slow,2(x+y)=x+y+n(z+y),当n=1时,化简为x=z,此时让两个指针分别从相遇点和头节点处一起走,在环形入口处相遇。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。方法一:找出链表A的长度,链表B的长度,求两者差值;快慢指针,快指针先走N步后,快慢指针同时走,直到快指针走到底,慢指针后一位就是需要删除的节点。快慢指针,快指针走两步,慢指针走一步,最后再相遇。

2023-04-22 19:21:22 608

原创 刷题第三天:206. 反转链表​203. 移除链表元素​707设计链表

1.链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。第二种:加一个头结点,头结点指向head,作为新的链表,设置指向新链表头结点的辅助结点cur,统一形式不需对头结点是否删除做判断。4.链表插入时,先将插入的节点连接后面的节点在将前面的节点和当前插入节点连接。单链表中要访问链表的结点,采用辅助结点,指向链表头结点,从链表头开始顺着。3.对于边界问题,代入特殊节点(头节点)查看边界。

2023-04-21 13:03:57 913 2

空空如也

空空如也

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

TA关注的人

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