- 博客(44)
- 收藏
- 关注
原创 第四十九天|单调栈| 42. 接雨水,84. 柱状图中最大的矩形
目录42. 接雨水(需要二刷!!!)暴力解法(超时)双指针优化单调栈解法84. 柱状图中最大的矩形暴力解法(超时)双指针解法(超时)单调栈解法建议二刷今天的两道题单调栈的顺序:42接雨水问题在面试中还是常见题目的。本题暴力解法也是也是使用双指针。首先要明确,要按照行来计算,还是按照列来计算。(一会按照行来计算一会按照列来计算,这样就会越写越乱。)按照行来计算如图:按照列来计算如图:推荐按照列来计算,比较容易理解。首先,如果按照列来计算的话,宽度一定是1了,我们再把每一列的雨水的高度求出来就可以了。可以看出每
2025-02-19 00:32:39
754
原创 第四十八天|单调栈| 739. 每日温度,496.下一个更大元素 I,503.下一个更大元素II
题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就。
2025-02-12 23:06:11
1069
原创 第四十六天|动态规划|子序列|647. 回文子串,5.最长回文子串, 516.最长回文子序列,动态规划总结篇
动态规划终于结束!第四十六天的总算是结束了,直冲Day48!
2025-02-06 17:04:07
1144
原创 第四十五天|动态规划|子序列|115.不同的子序列,583. 两个字符串的删除操作,72. 编辑距离,编辑距离总结篇
今天的三道题都有点难,115和583都是为了72做的铺垫,
2025-02-06 12:18:05
709
原创 第四十四天|动态规划|子序列|1143.最长公共子序列,1035.不相交的线,53. 最大子序和,392.判断子序列
1143的要求公共子序列,并且不连续。注意递推公式!并且注意二维DP优化为一维的情况,并不是简单地删维度!!!
2025-01-08 15:46:13
1148
原创 第四十三天|动态规划|子序列| 300.最长递增子序列 ,674. 最长连续递增序列,718. 最长重复子数组
不连续递增子序列的跟前0-i 个状态有关,连续递增的子序列只跟前一个状态有关。
2025-01-05 15:09:00
778
原创 第四十二天|动态规划|买卖股票|188.买卖股票的最佳时机IV,309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费,股票总结
使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]j的状态表示为:大家应该发现规律了吧 ,除了0以外,偶数就是卖出,奇数就是买入。题目要求是至多有K笔交易,那么j的范围就定义为 2 * k + 1 就可以了。 确定递推公式 还要强调一下:dp[i][1],表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票,这是很多同学容易陷入的误区。达到dp[i][1]状态,有两个具体操作:选最大的,所以 dp[i][1] = max(dp[i - 1][0] - pric
2024-12-30 01:09:00
1123
原创 第四十一天|动态规划|买卖股票|121. 买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股票的最佳时机III
因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。
2024-12-25 23:12:40
366
原创 第三十八天|动态规划|背包问题总结,322. 零钱兑换,279.完全平方数,139.单词拆分,多重背包
问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);动态规划:416.分割等和子集(opens new window)动态规划:1049.最后一块石头的重量 II(opens new window)问装满背包有几种方法:dp[j] += dp[j - nums[i]]动态规划:494.目标和(opens new window)动态规划:518. 零钱兑换 II(opens new window)
2024-12-15 23:05:07
764
原创 第三十七天|动态规划|完全背包, 518. 零钱兑换 II, 377. 组合总和 Ⅳ,70. 爬楼梯 (进阶)
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。,求解将哪些物品装入背包里物品价值总和最大。01背包和完全背包唯一不同就是体现在上:而的物品是可以添加多次的,所以要先遍历物品还是背包?中二维dp数组的两个for遍历的先后循序是可以颠倒了,一维dp数组的两个for循环先后循序一定是先遍历物品,再遍历背包容量。在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序是无所谓的!
2024-12-03 18:23:07
422
原创 第三十六天|动态规划|1049. 最后一块石头的重量 II, 494. 目标和,474.一和零
有几天没刷题了,感觉今天的这两道都有点难,理解地很慢,花了挺长时间。494是01背包应用之“有多少种不同的填满背包最大容量的方法“求组合类问题的公式,在求装满背包有几种方法的情况下),递推公式一般为:1049. 最后一块石头的重量 II本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,。本题物品的重量为stones[i],物品的价值也为stones[i]。对应着01背包里的物品重量weight[i]和 物品价值value[i]。。
2024-11-30 12:56:38
1241
原创 第三十五天|动态规划| 01背包的多种应用,01背包问题 二维,01背包问题 一维,416. 分割等和子集
dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。
2024-11-23 23:43:28
1052
原创 第三十四天|动态规划|62.不同路径,63. 不同路径 II,343. 整数拆分 ,96. 不同的二叉搜索树
那么从1遍历j,比较(i - j) * j和dp[i - j] * j 取最大的。从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。j的结束条件是 j < i - 1 ,其实 j < i 也是可以的,不过可以节省一步,例如让j = i - 1,的话,其实在 j = 1的时候,这一步就已经拆出来了,重复计算,所以 j < i - 1。
2024-11-20 21:57:59
1014
原创 第三十二天|动态规划| 理论基础,509. 斐波那契数,70. 爬楼梯 ,746. 使用最小花费爬楼梯
一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。dp[i]: 爬到第i层楼梯,有dp[i]种方法。
2024-11-16 10:59:47
736
2
原创 第二十九天|贪心算法| 134. 加油站, 135. 分发糖果 ,860.柠檬水找零,406.根据身高重建队列
暴力的方法很明显就是O(n^2)的,遍历每一个加油站为起点的情况,模拟一圈。如果跑了一圈,中途没有断油,而且最后油量大于等于0,说明这个起点是ok的。暴力的方法思路比较简单,但代码写起来也不是很容易,关键是要模拟跑一圈的过程。for循环适合模拟从头到尾的遍历,而while循环适合模拟环形遍历,要善于使用while!
2024-11-09 14:48:03
1101
原创 第二十八天|贪心算法|122.买卖股票的最佳时机II,55. 跳跃游戏,45.跳跃游戏II,1005.K次取反后最大化的数组和
思路:想获得利润至少要两天为一个交易单元。分解利润假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。此时就是把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑!那么根据 prices 可以得到每天的利润序列:(prices[i] - prices[i - 1]).....(prices[1]
2024-11-04 15:24:10
1104
原创 第二十七天|贪心算法| 理论基础 ,455.分发饼干,376. 摆动序列,53. 最大子序和
针对以上情形,result 初始为 1(默认最右面有一个峰值),此时 curDiff <= 0 && preDiff > 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2)如果 -2 1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方!这种写法,两个循环的顺序改变了,先遍历的饼干,在遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。我的思路只是求差值然后用flag记录,但是也没做出来。
2024-10-19 17:21:39
1004
原创 第二十五天|回溯算法| 491.递增子序列,46.全排列,47.全排列 II,332.重新安排行程,51.N皇后,37.解数独,总结
方法1代码用了HashSet来记录本层元素是否重复使用。
2024-10-15 23:15:59
542
原创 第二十四天|回溯算法| 93. 复原IP地址,78. 子集,90. 子集II
Integer.parseInt(s)是把字符串解析成int基本类型Integer.valueOf(s)是把字符串解析成Integer对象类型其实int就是Integer解包装,Integer就是int的包装,在jdk8中已经自动实现了自动解包装和自动包装,所以两种方式都能得到想要的整数值。
2024-10-09 22:21:50
441
原创 第二十三天|回溯算法| 39. 组合总和,40. 组合总和II,131. 分割回文串
今天的题目自己都没啥思路,二刷的时候再理解一下。尤其是131.
2024-10-09 20:28:56
1062
原创 第二十二天|回溯算法| 理论基础,77. 组合(剪枝),216. 组合总和III,17. 电话号码的字母组合
回溯和递归是相辅相成的。回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯法其实就是暴力查找,并不是什么高效的算法。因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。
2024-10-07 15:38:26
840
原创 第二十一天|二叉搜索树的属性,修改与构造,二叉树章节总结| 669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜索树,538. 把二叉搜索树转换为累加树
本节的三道题都蛮好的,不是很难,但是自己也没法完全写出来,需要再看再尝试!
2024-10-07 01:32:17
758
原创 第二十天|二叉搜索树的公共祖先,修改与构造| 235. 二叉搜索树的最近公共祖先, 701. 二叉搜索树中的插入操作,450. 删除二叉搜索树中的节点
对于二叉搜索树的最近祖先问题,其实要比普通二叉树的最近公共祖先问题简单的多。不用使用回溯,二叉搜索树自带方向性,可以方便的从上向下查找目标区间,遇到目标区间内的节点,直接返回。最后给出了对应的迭代法,二叉搜索树的迭代法甚至比递归更容易理解,也是因为其有序性(自带方向性),按照目标区间找就行了。思路:不需要遍历整棵树,找到结果直接返回!因为二叉搜索树是有序树,所以 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组一定是在 [p, q]区间的。注意:如何保证该节点就是最近公共祖先呢。
2024-10-05 18:54:54
1461
原创 第十八天|求二叉搜索树的属性,二叉树公共祖先问题| 530. 二叉搜索树的最小绝对差,501. 二叉搜索树中的众数,236. 二叉树的最近公共祖先
注意:自己写的时候出现的问题!左右子节点并不直接满足。二叉搜索树的中序遍历结果是有序的,因此相邻节点之间的差值才是最小的。我的代码只是比较了当前节点的左右孩子,而没有全局考虑所有节点的相邻关系。重点:学会在递归遍历的过程中如何记录前后两个指针。递归法中序遍历。
2024-10-04 18:21:01
543
原创 第十七天|二叉树的修改与构造,求二叉搜索树的属性| 654. 最大二叉树, 617. 合并二叉树,700.二叉搜索树中的搜索, 98.验证二叉搜索树
二叉树与二叉搜索树
2024-10-03 15:25:26
497
原创 第十六天|二叉树的属性,修改与构造| 513. 找树左下角的值,112. 路径总和,113. 路径总和 II, 106.从中序与后序遍历序列构造二叉树, 105.从前序与中序遍历序列构造二叉树
下面给出用下标索引写出的代码版本:(思路是一样的,只不过不用重复定义vector了,每次用下标索引来分割)
2024-10-03 00:14:29
972
原创 第十五天|二叉树的属性| 110.平衡二叉树, 257. 二叉树的所有路径,404.左叶子之和, 222.完全二叉树的节点个数
此时递归的函数就已经写出来了,这个递归的函数传入节点指针,返回以该节点为根节点的二叉树的高度,如果不是二叉平衡树,则返回-1。分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0。返回值:以当前传入节点为根节点的树的高度。给定一个二叉树,判断它是否是高度平衡的二叉树。
2024-09-30 21:38:06
251
原创 第十四天|二叉树的属性与修改| 226.翻转二叉树,101. 对称二叉树,104.二叉树的最大深度,559.n叉树的最大深度, 111.二叉树的最小深度
边做变更中。
2024-09-08 20:40:18
452
原创 第十三天|二叉树的遍历| 理论基础,递归遍历,迭代遍历,层序遍历
int val;在现场面试的时候 面试官可能要求手写代码,所以数据结构的定义以及简单逻辑的代码一定要锻炼白纸写出来。因为我们在刷leetcode的时候,节点的定义默认都定义好了,真到面试的时候,需要自己写节点定义的时候,有时候会一脸懵逼!
2024-07-31 00:02:18
1817
原创 第十天|栈与队列| 232.用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047. 删除字符串中的所有相邻重复项
栈 : 先进后出队列:先进先出用栈来模拟队列的行为,两个栈一个输入栈,一个输出栈就可以实现。栈的初始化:Stack st = new Stack();boolean empty(); 测试堆栈是否为空。Object peek( ); 查看堆栈顶部的对象,但不从堆栈中移除它。Object pop( ); 移除堆栈顶部的对象,并作为此函数的值返回该对象。Object push(Object element); 把项压入堆栈顶部。int search(Object elem
2024-07-27 17:32:22
2135
原创 第九天|字符串| 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459.重复的子字符串(KMP算法)
边写边更中。
2024-07-25 10:36:12
819
原创 第七天|哈希表| 454.四数相加II,383. 赎金信, 15. 三数之和, 18. 四数之和
依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3)。的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下标作为双指针,找到nums[i] + nums[left] + nums[right] == 0。就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。
2024-07-23 10:23:55
2010
原创 第六天|哈希表| 242.有效的字母异位词, 349. 两个数组的交集, 202. 快乐数 1. 两数之和
边做边更中。哈希表。但是哈希法也是,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!
2024-07-22 08:29:02
330
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅