自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 训练营第四十四天 |135. 分发糖果860.柠檬水找零406.根据身高重建队列452. 用最少数量的箭引爆气球

力扣题目链接(opens new window)老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:那么这样下来,老师至少需要准备多少颗糖果呢?示例 1:示例 2:思路:采用两次遍历的方法,以确保每个孩子的糖果分配满足要求。第一次从左到右遍历以确保每个孩子的糖果数量满足从左向右的条件,第二次从右到左遍历以确保每个孩子的糖果数量满足从右向左的条件。最终累加所有孩子的糖果数就是所需的最少糖果数目。860.柠檬水找零

2024-06-21 11:00:47 486

原创 训练营第四十三天| 455.分发饼干376. 摆动序列53. 最大子序和122.买卖股票的最佳时机 II55. 跳跃游戏45.跳跃游戏 II1005.K次取反后最大化的数组和

贪心的本质是选择每一阶段的局部最优,从而达到全局最优。如何通过局部最优,推出整体最优。那么如何能看出局部最优是否能推出整体最优呢?最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧。还可以数学证明,有如下两种方法:贪心算法一般分为如下四步:做题的时候,只要想清楚局部最优 是什么,如果推导出全局最优,其实就够了。力扣题目链接(opens new window)假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们

2024-06-19 20:18:40 689

原创 训练营第四十二天| 583. 两个字符串的删除操作72. 编辑距离647. 回文子串516.最长回文子序列

力扣题目链接(opens new window)给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。示例:本题和动态规划:115.不同的子序列 (opens new window)相比,其实就是两个字符串都可以删除了。动规五部曲,分析如下:dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。这里dp数组的定义有点点绕,大家要撸清思路。当word1

2024-06-19 10:11:26 613

原创 训练营第四十一天| 1035.不相交的线53. 最大子序和392.判断子序列115.不同的子序列

而是dp[6]。

2024-06-18 14:49:20 822

原创 训练营第三十九天 | 300.最长递增子序列674. 最长连续递增序列718. 最长重复子数组1143.最长公共子序列

如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。举个例子A[1]如果和B[1]相同的话,dp[1][1] = dp[0][0] + 1,只有dp[0][0]初始为0,正好符合递推公式逐步累加起来。即当A[i] 和B[j]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;

2024-06-16 11:28:22 825

原创 训练营第三十八天 | 309.最佳买卖股票时机含冷冻期动态规划系列七总结714.买卖股票的最佳时机含手续费股票问题总结篇!

动态规划:买卖股票的最佳时机II (opens new window)中股票可以买卖多次了!这也是和121. 买卖股票的最佳时机 (opens new window)的唯一区别(注意只有一只股票,所以再次购买前要出售掉之前的股票)重点在于递推公式的不同。dp[i][0] 表示第i天持有股票所得现金。dp[i][1] 表示第i天不持有股票所得最多现金本题和121. 买卖股票的最佳时机 (opens new window)动态规划:买卖股票的最佳时机IV (opens new window)

2024-06-15 18:42:24 1064

原创 训练营第三十七天 | 122.买卖股票的最佳时机II123.买卖股票的最佳时机III188.买卖股票的最佳时机IV

如果dp[1]取dp[0] - prices[i],今天买入股票,那么dp[2] = max(dp[2], dp[1] + prices[i]);所以dp[4][4]已经包含了dp[4][2]的情况。如果dp[1]取dp[1],即保持买入股票的状态,那么 dp[2] = max(dp[2], dp[1] + prices[i]);那么第i天持有股票即dp[i][0],如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 即:dp[i - 1][1] - prices[i]。

2024-06-15 15:54:35 586

原创 训练营第三十六天| 337.打家劫舍 III121. 买卖股票的最佳时机

所谓树形DP就是在树上进行递归公式的推导。只不过平时我们习惯了在数组上推导公式,一下子换成了树,就需要对树的遍历方式足够了解!

2024-06-15 12:09:34 630

原创 训练营第三十三天 | 139.单词拆分动态规划:多重背包背包问题总结

关于这几种常见的背包,其关系如下:通过这个图,可以很清晰分清这几种常见背包之间的关系。确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组背包递推公式问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);问装满背包有几种方法:dp[j] += dp[j - nums[i]] ,

2024-06-11 11:05:59 580

原创 训练营第三十二天 | 377. 组合总和 Ⅳ70. 爬楼梯(进阶版)322. 零钱兑换279.完全平方数

凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。所有可能的组合为: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1)

2024-06-10 17:16:15 656

原创 训练营第三十一天 | 494.目标和474.一和零动态规划:完全背包理论基础518.零钱兑换II

解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4。dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。dp[j]其他下标对应的数值也应该初始化为0,从递推公式也可以看出,dp[j]要保证是0的初始值,才能正确的由dp[j - nums[i]]推导出来。而不会出现{5, 1}的情况。

2024-06-08 10:04:19 986

原创 训练营第三十天| 动态规划:01背包理论基础(滚动数组)416. 分割等和子集1049.最后一块石头的重量II

力扣题目链接(opens new window)题目难度:中等有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x!= y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。输入:[2,7,4,1,8,1]输出:1。

2024-06-07 14:18:19 547

原创 训练营第二十九天 | 343. 整数拆分96.不同的二叉搜索树动态规划:01背包理论基础

首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图:在看其他情况。状态转移方程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);可以看出i 是由 i-1 推导出来,那么i为0的时候就一定要初始化。dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。

2024-06-06 19:46:59 644

原创 训练营第二十八天 | 动态规划理论基础 动态规划 动态规划的解题步骤62.不同路径63. 不同路径 II

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由出来的,,贪心没有状态推导,而是从的,

2024-06-05 19:47:46 745

原创 训练营第二十七天 | 491.递增子序列46.全排列47.全排列 II332.重新安排行程51. N皇后

则同一树枝重复,是被允许的。拿题目中的示例为例,输入: [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]] ,这是有4个航班,那么只要找出一种行程,行程里的机场个数是5就可以了。所以终止条件是:回溯遍历的过程中,遇到的机场个数,如果达到了(航班数量+1),那么我们就找到了一个行程,把所有航班串在一起了。)来记录当前层中已经使用过的元素,以确保每个元素在每一层递归中只使用一次,但在不同的递归路径中可以使用相同的元素。

2024-06-05 10:45:53 930

原创 训练营第二十五天 | ● 216.组合总和III● 17.电话号码的字母组合39. 组合总和 40.组合总和II 131.分割回文串93.复原IP地址 78.子集

216.组合总和III216.组合总和III优化如下:已经选择的元素个数:path.size();所需需要的元素个数为: k - path.size();列表中剩余元素(n-i) >= 所需需要的元素个数(k - path.size())在集合n中至多要从该起始位置 : i <= n - (k - path.size()) + 1,开始遍历找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

2024-06-01 21:42:10 893

原创 训练营第二十四天| ● 理论基础 ● 77. 组合

从下图中红线部分可以看出,在集合[1,2,3,4]取1之后,下一层递归,就要在[2,3,4]中取数了,那么下一层递归如何知道从[2,3,4]中取数呢,靠的就是startIndex。示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]回溯法的搜索过程就是一个树型结构的遍历过程,在如下图中,可以看出for循环用来横向遍历,递归的过程是纵向遍历。,因为回溯法解决的都是在集合中递归查找子集,如此我们才遍历完图中的这棵树。

2024-06-01 09:29:35 161

原创 训练营第二十三天 | ● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树 ● 总结篇

669. 修剪二叉搜索树669. 修剪二叉搜索树题目:给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L)。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。思路:递归法。1,确定参数值和返回值参数值为根节点和上下限,返回值为新的根节点。2, 确定终止条件若为空则返回3, 单层递归的逻辑。

2024-05-30 19:33:09 826

原创 训练营第二十二天 | ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

因为是有序树,所以 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。

2024-05-29 20:25:05 338

原创 训练营第二十一天 | ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先

示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]530.二叉搜索树的最小绝对差。

2024-05-28 18:46:15 696

原创 训练营第十八天 | ● 513.找树左下角的值● 112. 路径总和 113.路径总和ii● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

513.找树左下角的值513.找树左下角的值题目:给定一个二叉树,在树的最后一行找到最左边的值。

2024-05-26 19:33:58 605

原创 训练营第十七天| ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

110.平衡二叉树110.平衡二叉树题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例 1:给定二叉树 [3,9,20,null,null,15,7]返回 true。思路:高度差用后序遍历会更简洁一些,用递归法。1.首先确定递归函数的参数值和返回值:参数:当前传入节点。返回值:以当前传入节点为根节点的树的高度。2.明确终止条件。

2024-05-25 21:08:13 284

原创 训练营第十六天 | 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。给定二叉树 [3,9,20,null,null,15,7],二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。给出一个完全二叉树,求出该树的节点个数。说明: 叶子节点是指没有子节点的节点。说明: 叶子节点是指没有子节点的节点。给定一个二叉树,找出其最大深度。给定一个二叉树,找出其最小深度。222.完全二叉树的节点个数。111.二叉树的最小深度。返回它的最小深度 2。的节点才是叶子节点。

2024-05-24 21:26:23 263 1

原创 训练营第十五天 | ● 层序遍历 10 ● 226.翻转二叉树 ● 101.对称二叉树 2

层序遍历 10层序遍历 10题目:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)。226.翻转二叉树翻转它其实就把每一个节点的左右孩子交换一下。

2024-05-23 21:49:06 245 1

原创 训练营第十四天 | ● 理论基础● 递归遍历 ● 迭代遍历● 统一迭代

链式储存int val;递归遍历确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。前序遍历public:// 中// 左// 右迭代遍历。

2024-05-21 21:52:10 245 1

原创 训练营第十三天 | 239. 滑动窗口最大值● 347.前 K 个高频元素● 总结

首先将数组的前 k个元素放入优先队列中。每当向右移动窗口时,就把一个新的元素放入优先队列中,此时堆顶的元素就是堆中所有元素的最大值。此时,堆顶元素就是滑动窗口中的最大值。给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。如果新的元素的频率比堆顶端的元素大,则弹出堆顶端的元素,将新的元素添加进堆中,给定一个非空的整数数组,返回其中出现频率前 k 高的元素。每次都将新的元素与堆顶元素(堆中频率最小的元素)进行比较,最终,堆中的 kkk 个元素即为前 kkk 个高频元素。

2024-05-20 21:57:03 186

原创 训练营第十一天 | 20. 有效的括号● 1047. 删除字符串中的所有相邻重复项● 150. 逆波兰表达式求值

如果不是相同的类型,或者栈中并没有左括号,那么字符串 s 无效,返回 False。遍历字符串,如果是数字就压入栈,如果是运算符,就对栈顶的两个数进行运算,并将结果压入栈。在遍历结束后,如果栈中没有左括号,说明字符串 s 中的所有左括号闭合,返回 True,否则返回 False。遍历完后,栈中的元素便是结果,直接返回。给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

2024-05-18 21:59:16 191

原创 训练营第十天 | ● 理论基础● 232.用栈实现队列● 225. 用队列实现栈

栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。push(x) -- 将一个元素放入队列的尾部。peek() -- 返回队列首部的元素。empty() -- 返回队列是否为空。pop() -- 从队列首部移除元素。队列是先进先出,栈是先进后出。225. 用队列实现栈。232.用栈实现队列。

2024-05-17 21:25:58 122

原创 训练营第八天 |● 344.反转字符串● 541. 反转字符串II● 卡码网:54.替换数字● 151.翻转字符串里的单词● 卡码网:55.右旋转字符串

给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。双指针法: 定义两个指针,一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。

2024-05-15 21:29:12 387

原创 训练营第七天 | 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和

454.四数相加II题目:给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500。所有整数的范围在 -2^28 到 2^28 - 1 之间,最终结果不会超过 2^31 - 1。

2024-05-14 21:06:57 913 2

原创 算法训练营第六天 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

哈希表理论基础哈希表理论基础。

2024-05-13 22:28:46 559

原创 训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、160. 链表相交、142.环形链表II

24. 两两交换链表中的节点题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。思路:根据图示顺序重新指向箭头(画图分析时不要忘记将dummyhead画出)其中需要注意由于“1”和“3”要断开前面的箭头,意味着位置丢失,需要先将它们赋值给temp,再进行赋值。同时注意退出while循环的条件,需要判断“cur->next" 和 "cur->next->next"是否为空,且有顺序要求。

2024-05-11 21:36:56 794 1

原创 第三天 | 206.反转链表、707.设计链表、203.移除链表元素

int val;// 节点上存储的元素// 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数C++默认生成一个构造函数,但是这个构造函数不会初始化任何成员变量,所以在初始化的时候就不能直接给变量赋值!

2024-05-10 15:16:47 890

原创 代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

今天的题目用基础的思路解决稍微复杂一些的问题,稍微上了一些难度,且对细节的把控能力要求更高。今天时间不够,没有深入消化,等有空再好好消化并完善笔记。

2024-05-09 22:40:12 414

原创 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

二分查找和移除元素都是基础的操作,步骤简单但是还是有很多细节值得注意。

2024-05-08 13:51:54 414

空空如也

空空如也

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

TA关注的人

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