![](https://img-blog.csdnimg.cn/0875d25638a043e687a49d27556f91f3.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
代码随想录
整理代码随想录这本书的笔记
龙崎流河
沉淀
展开
-
42. 接雨水 84.柱状图中最大的矩形
最优解:双指针法。原创 2023-03-16 16:23:54 · 73 阅读 · 0 评论 -
739. 每日温度 496.下一个更大元素 I 503. 下一个更大元素 II
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。原创 2023-03-15 20:20:05 · 70 阅读 · 0 评论 -
647. 回文子串 516. 最长回文子序列
动态规划:dp[i][j] 表示字符串下标从i到j是否是回文字符串时间空间复杂度都是n ^ 2为降低空间复杂度使用中心扩散法:分成两种扩散,一种是中心点是一个元素的扩散,奇数个数的回文字符串,另一种是中心点是两个元素的扩散,偶数个数的回文字符串。原创 2023-03-14 14:21:51 · 66 阅读 · 0 评论 -
583. 两个字符串的删除操作 72. 编辑距离
【代码】583. 两个字符串的删除操作 72. 编辑距离。原创 2023-03-14 00:18:52 · 65 阅读 · 0 评论 -
300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组 1143. 最长公共子序列
该题关键就是定义dp,dp[i]是以nums[i]为结尾的i之前包括i的最长递增子序列。需要遍历i之前的元素和nums[i]比较大小,如果nums[i] > nums[j]那么就属于递增,就dp[i]+1。原创 2023-03-12 14:47:28 · 201 阅读 · 0 评论 -
309. 最佳买卖股票时机含冷冻期 714. 买卖股票的最佳时机含手续费
比较好理解就是卖出时候减去手续费即可。不太好想,买入的时候加上手续费。原创 2023-03-11 22:55:45 · 65 阅读 · 0 评论 -
买卖股票的最佳时机 I II III IV
自己的思路:采用求最长连续子串和题目的思路dp[i][0] dp[i][1] 表示第i天持有股票所得最多现金.持有股票dp[i][0]:1.之前就持有股票dp[i - 1][0]2.现在刚持有也就是买入股票-prices[i]不持有股票dp[i][1]:1.之前就不持有股票dp[i - 1][1]2.现在刚不持有也就是卖掉股票dp[i - 1][0] + prices[i]优化空间复杂度,不需要那么长的数组只需要两块。原创 2023-03-11 11:43:53 · 401 阅读 · 0 评论 -
198.打家劫舍 213.打家劫舍II 337.打家劫舍 III
res[0]表示没偷当前节点,res[0] = Math.max(left[0],left[1]) + Math.max(right[0],right[1]);也就是左右两节点有没有被偷过无所谓,取偷过或者没偷过的最大值即可。res[1]表示偷了当前节点,res[1] = root.val + left[0] + right[0] 也就是左右孩子节点没被偷过的值加上当前被偷的值就是盗取的金额。可以使用一个map把计算过的结果保存一下,这样如果计算过孙子了,那么计算孩子的时候可以复用孙子节点的结果。原创 2023-03-10 19:55:51 · 137 阅读 · 0 评论 -
322. 零钱兑换 279.完全平方数 139.单词拆分
完全背包问题,需要注意的是数组的初始值。原创 2023-03-08 23:02:23 · 190 阅读 · 0 评论 -
零钱兑换II 组合总和 Ⅳ 爬楼梯(0-1背包)
但本题和纯完全背包不一样,纯完全背包是凑成背包最大价值是多少,而本题是要求凑成总金额的物品组合个数!回归本题,动规五步曲来分析如下:确定dp数组以及下标的含义dp[j]:凑成总金额j的货币组合数为dp[j]确定递推公式dp[j] 就是所有的dp[j - coins[i]](考虑coins[i]的情况)相加。dp数组如何初始化首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。如果dp[0] = 0 的话,后面所有推导出来的值都是0了。原创 2023-03-08 21:43:52 · 196 阅读 · 0 评论 -
416. 分割等和子集
01背包相对于本题,主要要理解,题目中物品是nums[i],重量是nums[i],价值也是nums[i],背包体积是sum/2。如果dp[j] == j 说明,集合中的子集总和正好可以凑成总和j,理解这一点很重要。只有确定了如下四点,才能把01背包问题套到本题上来。dp[j]的数值一定是小于等于j的。原创 2023-03-03 13:05:35 · 65 阅读 · 0 评论 -
343. 整数拆分 96.不同的二叉搜索树
这题用动态规划确实没想到。原创 2023-03-02 22:03:25 · 88 阅读 · 0 评论 -
62. 不同路径 63. 不同路径 II
【代码】62. 不同路径 63. 不同路径 II。原创 2023-02-20 22:48:42 · 80 阅读 · 0 评论 -
509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
【代码】509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯。原创 2023-02-20 22:15:49 · 86 阅读 · 0 评论 -
491.递增子序列 46.全排列 47.全排列 II
同一父节点下的同层上使用过的元素就不能再使用了。原创 2023-02-12 14:21:28 · 66 阅读 · 0 评论 -
93.复原IP地址 78.子集 90.子集II
【代码】93.复原IP地址 78.子集 90.子集II。原创 2023-02-11 13:02:06 · 65 阅读 · 0 评论 -
39. 组合总和 40.组合总和II 131.分割回文串
如果candidates[i] == candidates[i - 1] 并且 used[i - 1] == false,就说明:前一个树枝,使用了candidates[i - 1],也就是说同一树层使用过candidates[i - 1]。此时for循环里就应该做continue的操作。原创 2023-02-10 13:54:51 · 65 阅读 · 0 评论 -
216.组合总和III 17.电话号码的字母组合
【代码】216.组合总和III 17.电话号码的字母组合。原创 2023-02-08 14:08:41 · 74 阅读 · 0 评论 -
第77题. 组合
组合问题是回溯法解决的经典问题,我们开始的时候给大家列举一个很形象的例子,就是n为100,k为50的话,直接想法就需要50层for循环。然后进一步把回溯法的搜索过程抽象为树形结构,可以直观的看出搜索的过程。举个例子,n = 4,k = 3, 目前已经选取的元素为0(path.size为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。在集合n中至多要从该起始位置 : n - (k - path.size()) + 1,开始遍历。已经选择的元素个数:path.size();原创 2023-02-07 14:42:52 · 78 阅读 · 0 评论 -
669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
递归法:如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。返回root节点。原创 2023-02-06 12:33:51 · 352 阅读 · 0 评论 -
235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
难题:删除节点比增加节点复杂很多,尤其是删除节点的左右节点都不为null的情况下。原创 2023-02-04 21:43:52 · 79 阅读 · 0 评论 -
530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
二叉搜索树中序遍历。原创 2023-02-03 12:03:11 · 81 阅读 · 0 评论 -
654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
就是重建二叉树的思路,加上递归中遍历找最大值记录下来最大值和最大值下标。原创 2023-02-02 23:47:06 · 74 阅读 · 0 评论 -
513. 找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树
递归法:利用二叉树的高度来解题,原创 2023-02-01 12:52:50 · 82 阅读 · 0 评论 -
110平衡二叉树 257二叉树的所有路径 404左叶子之和
【代码】110平衡二叉树 257二叉树的所有路径 404左叶子之和。原创 2023-01-31 13:27:54 · 77 阅读 · 0 评论 -
04.二叉树的最大深度 (优先掌握递归)111.二叉树的最小深度 (优先掌握递归) 222.完全二叉树的节点个数(优先掌握递归)
如果采用上一种方法,没有使用完全二叉树的条件不太合理。时间复杂度(lgn * lgn)空间复杂度(lgn)原创 2023-01-30 20:24:46 · 82 阅读 · 0 评论 -
二叉树的层次遍历
本题依然是层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了。需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点.关键点在于queue.size()在上一题基础上反转结果即可。原创 2023-01-28 20:53:14 · 1505 阅读 · 0 评论 -
239. 滑动窗口最大值 347.前 K 个高频元素
剑指offer题目。原创 2023-01-28 15:24:57 · 67 阅读 · 0 评论 -
20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值
【代码】20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值。原创 2023-01-26 22:49:56 · 82 阅读 · 0 评论 -
232.用栈实现队列 225. 用队列实现栈
栈实现队列,只有出队时比较复杂。比如连续入栈1,2,3,4如果想要出队,那么需要出队1,所以将stack1的所有元素出栈入栈到stack2中出栈stack2即可,如果再入栈5,继续入栈stack1到这里如果要是出队的话,直接出栈stack2即可,直到stack2为空时,再将stack1中的元素入栈到stack2中。入栈一直入栈stack1。这样就实现了两个栈完成队列操作。原创 2023-01-21 15:59:37 · 74 阅读 · 0 评论 -
28. 实现 strStr() 459.重复的子字符串
将两个相同字符串拼接,拼接后的字符串如果还出现当时的字符串,那么就说明存在重复的子字符串,需要去除字符串的首尾字符来避免刚开始或者结束的字符串中匹配到。数组长度减去最长相同前后缀的长度相当于是第一个周期的长度,也就是一个周期的长度,如果这个周期可以被整除,就说明整个数组就是这个周期的循环。原创 2023-01-21 14:58:34 · 82 阅读 · 0 评论 -
344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串
这道题双指针太简单了,没什么好说的。原创 2023-01-19 22:25:17 · 72 阅读 · 0 评论 -
454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和
巧用哈希表,哈希表键值对对应的是两数之和,两数之和出现次数。原创 2023-01-17 15:51:29 · 366 阅读 · 0 评论 -
242. 有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
时间空间复杂度均为O(n),不是最优解使用数组,,使用数组降低空间复杂度,因为数组空间固定为26,代表26个字母,因此空间复杂度降为O(1),时间复杂度为O(n)。原创 2023-01-16 20:32:02 · 66 阅读 · 0 评论 -
24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 42.环形链表II
这道题也是需要哨兵节点,并需要一个指向哨兵节点的指针来操作交换链表节点,只要一个节点一个节点挪动指针,该题思路就会很清晰,需要提前保存两个节点路径,一个是cur.next,另一个是cur.next.next.next,具体详细见代码。原创 2023-01-14 01:17:26 · 85 阅读 · 0 评论 -
203. 移除链表元素 707 设计链表 206 反转链表
此题需要哨兵节点注意边界即可,很简单不多概述。原创 2023-01-13 19:05:53 · 84 阅读 · 0 评论 -
977. 有序数组的平方 209. 长度最小的子数组 59. 螺旋矩阵 II
快速排序使用库函数,时间复杂度为O(nlgn),空间复杂度为O(1)牺牲空间复杂度换时间双指针法,并创建一个辅助数组存值,因为存的是平方数,所以原数组左侧可能是负数平方后可能比右侧的平方大,所以依次比较大小,大的值存入辅助数组最后一个位置,具体见代码。原创 2023-01-13 16:24:50 · 70 阅读 · 0 评论 -
704. 二分查找、27. 移除元素
该二分法套用的我自己的模板,原创 2023-01-11 16:14:29 · 214 阅读 · 0 评论 -
253. 会议室 II(会员题目)
举例来说,如果输入 meetings = [[0,30],[5,10],[15,20]],那么我们就给数组中 [0,30],[5,10],[15,20] 这几个索引区间分别加一,最后遍历数组,求个最大值就行了。比如给你输入 meetings = [[0,30],[5,10],[15,20]],算法应该返回 2,因为后两个会议和第一个会议时间是冲突的,至少申请两个会议室才能让所有会议顺利进行。把这些会议的时间区间进行投影,红色的点代表每个会议的开始时间点,绿色的点代表每个会议的结束时间点。原创 2023-01-09 14:59:42 · 353 阅读 · 0 评论 -
1024. 视频拼接
首先要进行排序:排序顺序以二维数组第一个值为准顺序从小到大排列,如果二维数组第一值也就是视频起始点相等,则按照终点逆序排列。为什么这样排序呢,主要考虑到这道题的以下两个特点:1、要用若干短视频凑出完成视频 [0, T],至少得有一个短视频的起点是 0。这个很好理解,如果没有一个短视频是从 0 开始的,那么区间 [0, T] 肯定是凑不出来的。2、如果有几个短视频的起点都相同,那么一定应该选择那个最长(终点最大)的视频。原创 2023-01-09 14:53:35 · 1223 阅读 · 0 评论