LeetCode 刷题
文章平均质量分 86
我想喝冰阔乐
这个作者很懒,什么都没留下…
展开
-
day37 | 738.单调递增的数字、968.监控二叉树
贪心的感觉就是去找规律,找局部最优情况,只要能推出全局最优,就可以按照思路尝试一下。原创 2023-09-08 17:21:22 · 308 阅读 · 0 评论 -
day36 | 435. 无重叠区间、763.划分字母区间、56. 合并区间
1、vector的操作,例如取最后一个 result.back() 这些还需要多加熟悉。2、遇到区间问题,可以考虑先排序。原创 2023-09-07 11:53:57 · 427 阅读 · 0 评论 -
day35 | 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球
1、区间问题,很多都可以想想是不是需要进行先排序再处理。2、遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。如果两个维度一起考虑一定会顾此失彼。3、遇到感觉没有思路的题目,可以静下心来把能遇到的情况分析一下,只要分析到具体情况了,一下子就豁然开朗了。原创 2023-09-05 15:16:18 · 308 阅读 · 0 评论 -
day34 | 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果
贪心如果局部有两种情况,或者多种贪心策略,可以分开来考虑,不然容易顾此失彼。原创 2023-09-05 11:56:14 · 77 阅读 · 0 评论 -
day32 | 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
1、贪心类问题,有时候没有特定的写法。看能不能想到如何从局部推导到全局。2、买卖股票类动态规划类问题,每天的状态需要设置成两个不同的。原创 2023-09-01 10:00:29 · 77 阅读 · 0 评论 -
day31 | 455.分发饼干、376. 摆动序列、53. 最大子序和
1、贪心算法确实比较看能不能想到思路。2、好像很多都能转成动态规划去做。原创 2023-08-28 13:53:54 · 343 阅读 · 0 评论 -
day29 | 491.递增子序列、46.全排列、47.全排列 II
1、排列问题中,由于用不到startindex,所以只能新建一个used数组来进行重复记录。2、一般来说:组合问题和排列问题是在树形结构的叶子节点上收集结果,而子集问题就是取树上所有节点的结果。每层都是从0开始搜索而不是startIndex需要used数组记录path里都放了哪些元素了4、数组,set,map都可以做哈希表,而且数组干的活,map和set都能干,但如果数值范围小的话能用数组尽量用数组。原创 2023-08-27 12:01:09 · 191 阅读 · 0 评论 -
day30| 332.重新安排行程、51. N皇后、37. 解数独
1、回溯的模板void backtracking(参数) {if (终止条件) {存放结果;return;for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表);// 递归回溯,撤销处理结果2、组合问题。用递归控制for循环嵌套的数量!for循环横向遍历,递归纵向遍历,回溯不断调整结果集。3、如果是一个集合来求组合的话,就需要startIndex。原创 2023-08-26 17:41:12 · 128 阅读 · 0 评论 -
day28 | 93.复原IP地址、78.子集、 90.子集II
1、子集是收集树形结构中树的所有节点的结果。而组合问题、分割问题是收集树形结构中叶子节点的结果。2、注意对于去重的方法。可以使用used数组或者利用startIndex进行去重。原创 2023-08-25 15:03:22 · 55 阅读 · 0 评论 -
day27 | 39. 组合总和、 40.组合总和II、131.分割回文串
1、剪枝操作,可以是在for循环里面,也可以在开头的结束判断处。2、startindex 对于一个集合里面求取,则需要。否则,不需要。如果for循环传入的是 startindex 而不是 i, 则求的是排列数而不是组合数。原创 2023-08-24 16:15:15 · 252 阅读 · 0 评论 -
day25 | 216.组合总和III、 17.电话号码的字母组合
1、回溯法中递归函数参数很难一次性确定下来,一般先写逻辑,需要啥参数了,填什么参数。2、这种利用二位数组下标来存放元素的方法非常值得学习。本题最主要的是如何根据元素取到对应的循环。原创 2023-08-23 21:44:41 · 166 阅读 · 0 评论 -
day24 | 理论基础、77. 组合
今日学到了:1、回溯三部曲。确定返回值及参数确定终止条件确定单层的遍历过程2、for循环里面相当于是宽度,for循环里面的回溯相当于是深度。3、剪枝操作一般都是在for循环那里,(n - (k - path.size()) + 1)。即选择搜索的极限位置。原创 2023-08-23 18:01:36 · 74 阅读 · 0 评论 -
day23 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
看到二叉树,看到递归,想:返回值、参数是什么?终止条件是什么?单层逻辑是什么?涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。原创 2023-08-22 11:15:43 · 95 阅读 · 0 评论 -
day22 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
二叉搜索树添加节点只需要在叶子上添加就可以的,不涉及到结构的调整,而删除节点操作涉及到结构的调整。原创 2023-08-21 11:21:14 · 76 阅读 · 0 评论 -
day21 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
二叉搜索树的特性,经常和双指针法一起使用。迭代法和递归法的一般写法。原创 2023-08-20 11:03:44 · 116 阅读 · 0 评论 -
day20 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
1、使用迭代法同时处理两棵树就是要把这两棵树的节点同时加入队列进行比较。2、二叉搜索树要尽量用中序遍历,利用二叉搜索树的特性。用一个指针记录前一个节点,是个很好的思路。3、注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。4、一般情况来说:如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整。原创 2023-08-19 11:33:17 · 169 阅读 · 1 评论 -
day18 | 513.找树左下角的值、112. 路径总和 113.路径总和ii、构造二叉树
就算是思路清晰, 代码写出来一定是各种问题,所以一定要加日志来调试,看看是不是按照自己思路来切割的,不要大脑模拟,那样越想越糊涂。原创 2023-08-18 12:02:55 · 80 阅读 · 0 评论 -
day17 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和
1、c++写代码中,如果最后的处理节点在空节点处,则遍历的时候不用加 if(cur→left) 这样的判断条件。如果处理的节点是在叶子节点,则空节点不进入处理的逻辑,需要加判断条件。2、使用to_string函数可以将数字转换为字符串,返回值为转换完的字符串。默认情况下,to_string默认输出6位小数,但这不一定是您想要的。C ++ 11引入了std :: to_string的另一个重载版本,该版本接受一个小数位数参数。头文件:include<cstring。原创 2023-08-17 12:03:48 · 307 阅读 · 0 评论 -
day16 | 104.二叉树的最大深度、111.二叉树的最小深度、 222.完全二叉树的节点个数
递归和层序遍历以及掌握的还可以了。主要是具体问题需要具体分析,稍微修改下代码。原创 2023-08-17 11:11:40 · 57 阅读 · 0 评论 -
day15 | 层序遍历、 226.翻转二叉树、101. 对称二叉树
写递归的时候,注意三部曲:1、确定递归函数的参数和返回值2、确定终止条件3、确定单层递归的逻辑。原创 2023-08-16 17:27:05 · 107 阅读 · 0 评论 -
day 14 | 递归遍历、迭代遍历、统一迭代
今天主要是了解了二叉树的几种遍历方式。递归遍历时最简单的。迭代遍历,利用栈来进行遍历,但是集中遍历方式的风格不太统一。统一迭代在迭代遍历的基础上,添加了一个空指针作为标记,使得整体风格比较统一。重点掌握递归和统一。原创 2023-08-16 16:20:31 · 135 阅读 · 0 评论 -
day13 | 239. 滑动窗口最大值、347.前 K 个高频元素
队列问题,还是很难的。原创 2023-08-16 14:25:19 · 62 阅读 · 0 评论 -
day 11 | 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
主要把栈的相关题刷了一下。栈对于成对的符号检测,逆波兰表达式运算应用广泛。栈一个特征点就是能知道遍历的上一个元素的值,用于后序比较。原创 2023-08-15 21:06:49 · 107 阅读 · 0 评论 -
day 10 | 232.用栈实现队列、 225. 用队列实现栈
很多算法题目主要是对知识点的考察和教学意义远大于其工程实践的意义,所以面试题也是这样!原创 2023-08-14 11:25:56 · 90 阅读 · 0 评论 -
day9 | 28. 实现 strStr()、459.重复的子字符串
字符串类类型的题目,往往想法比较简单,但是实现起来并不容易,复杂的字符串题目非常考验对代码的掌控能力。双指针法是字符串处理的常客。KMP算法是字符串查找最重要的算法。原创 2023-08-14 11:04:27 · 95 阅读 · 0 评论 -
day8 | 344.反转字符串、541. 反转字符串II、 剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
1、字符串的操作经常需要使用到双指针和反转的思想。2、还是需要记住一些库函数的。常见的字符串操作函数总结:(参考:https://blog.csdn.net/Cyril_KI/article/details/106165976)1、构造函数:string str:空串,string s(str)复制str到s,string s(num,c)生成由num个c字符构成的字符串。2、插入函数:有两种push_back()和insert(),后者比较常用。原创 2023-08-14 09:03:26 · 34 阅读 · 0 评论 -
day7 | 454.四数相加II、383. 赎金信、 15. 三数之和、18. 四数之和
有时候哈希表不一定就是比较简单的。原创 2023-08-11 18:13:27 · 175 阅读 · 0 评论 -
day4 | 24. 两两交换链表中的节点、 19.删除链表的倒数第N个节点、 面试题 02.07. 链表相交、 142.环形链表II
链表相交那道题没想明白,为啥相交节点之后的长度一定相等。不过后一种方法的思路挺清晰的。进度落后,需要加快进度。原创 2023-08-07 17:13:40 · 139 阅读 · 0 评论 -
day3 | 203.移除链表元素、707.设计链表、206.反转链表
链表设置虚拟头节点,可以极大方便操作。原创 2023-08-04 18:57:45 · 218 阅读 · 0 评论 -
代码随想录一刷总结
最开始的时候是最难的,我最开始刷题的时候,可能自己一个下午也做不出来一道题。后来开始慢慢找方法,不死磕题目,遇到不会的没思路的直接看解题。我觉得刚开始刷题,如果能自己解出来当然很好,但是很多时候都是解不出来的。前期就是一个学习积累的过程,只有练习多了,才能很快的AC题目。我记得很久以前就知道了代码随想录,但是想着时间还早,就没怎么重视。做笔记是一个很好的习惯,有时候我们做一道题,可能当时能过,但是后面过了一段时间,再去看就发现已经不会了。做笔记记录下思路,同时也是个输出的过程,是最有效的学习方法。原创 2023-07-24 20:36:56 · 222 阅读 · 0 评论 -
day60 | 84.柱状图中最大的矩形、反思
对于矩形的最大面积,应该是以当前柱子为基准,往两边分别找比它更小的。如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left。此外,考虑到特殊情况,有些数据无法处理,在数组的两边添加0,保证所有的单调栈都能出栈。如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。那么结尾加一个0,就会让栈里的所有元素,走到情况三的逻辑。原创 2023-07-23 16:43:27 · 198 阅读 · 0 评论 -
day59 | 503.下一个更大元素II、42. 接雨水
*可以看出每一列雨水的高度,取决于,该列 左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度。思考:如果是双指针的话,每次走到一个坑洼处就把中间的雨水量记录下来(计算坑洼的面积,最低的高度 x 宽度 - 低洼处的面积)。因为一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。在暴力解法中,我们可以看到只要记录左边柱子的最高高度 和 右边柱子的最高高度,就可以计算当前位置的雨水面积,这就是通过列来计算。原创 2023-07-23 15:13:13 · 168 阅读 · 0 评论 -
day58 | 739. 每日温度、496.下一个更大元素 I
因为只有递增的时候,栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i。查询是否存在,如果再套一个for循环,时间复杂度直接变为n方,这样用一个map来查询,可以降低时间复杂度。2、利用单调栈,找在nums2中下标之后有无更大的元素。跟我想的不同的点,再与用了一个map来保存nums1的数值。思考:暴力的解法就是两层for循环,遍历当天温度后,再遍历当天温度之后的温度。栈头到栈底的顺序,从小到大,即递增顺序。如果是递减栈,则是求第一个比自己小的元素。时间复杂度为O(n)。原创 2023-07-20 14:53:00 · 137 阅读 · 0 评论 -
day57 | 647. 回文子串、516.最长回文子序列
思考:可以仿照上题的思路,对于[i, j] 区间内的最长子序列表示为dp[i][j],如果s[i] == s[j] ,那么最长长度就等于[i+1, j-1] + 2, 否则,只考虑一端的最大值。根据回文的定义,布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。dp[i][j] 表示区间[i,j] 内s的最长的回文子序列长度。原创 2023-07-19 11:34:42 · 162 阅读 · 0 评论 -
day56 | 583. 两个字符串的删除操作、72. 编辑距离
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b8z0Q9ya-1689651377419)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6e3deb1a-60ef-464b-ad7b-a739852f5ec5/Untitled.png)]dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j -1] +2).原创 2023-07-18 11:36:43 · 157 阅读 · 0 评论 -
day55 | 392.判断子序列、115.不同的子序列
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][j]和dp[i][0]是一定要初始化的。原创 2023-07-17 11:51:07 · 69 阅读 · 0 评论 -
day53 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和
如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);原创 2023-07-16 17:11:37 · 166 阅读 · 0 评论 -
day52 | 300.最长递增子序列、最长连续递增序列、最长重复子数组
但dp[i][0] 和dp[0][j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;1、含义:dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。同时题目要求长度最长的子数组的长度。原创 2023-07-16 08:12:11 · 567 阅读 · 0 评论 -
day51| 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
如果i为1,第1天买入股票,那么递归公式中需要计算 dp[i - 1][1] - prices[i] ,即 dp[0][1] - prices[1],那么大家感受一下 dp[0][1] (即第0天的状态二)应该初始成多少,只能初始为0。那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);要把各种状态间的情况分析清楚。即:dp[i][2] = dp[i - 1][0] + prices[i];原创 2023-07-13 11:34:20 · 77 阅读 · 0 评论 -
day50 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV
一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]);所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][1]呢?此时还没有买入,怎么就卖出呢?原创 2023-07-12 14:27:49 · 93 阅读 · 0 评论