- 博客(59)
- 收藏
- 关注
原创 代码随想录一刷总结
自从读研后,感觉空落落的,没有明确目标,每日干点这个干点那个。重新规划,重新起航,做一个有规律,有计划执行力max的人,把想做的事一件一件做好做完美,踏踏实实一步一个脚印,总能有一个让自己感到惊喜的收获。第一点当然就是coding能力的提升,虽然每天都被不同的题目摩擦,但其实经过不断的总结,再回国头来看当初那些觉得很难的题目,其实也就那样。再次感叹,千万别钻牛角尖,有时候钻牛角尖,坐在电脑屏幕前一天,能ac固然觉得有收获,但是大多数情况往往在一开始思想方向就错了,这样即便再想一天、一周也是徒劳。
2024-06-06 15:57:15
262
原创 leetcode刷题
其中计算雨水面积要横向计算,不能只看某一个竖列(我就卡在了这一步,因此没有做出来)。和上一题相反,上一题是求凹槽面积,这一题是求凸出来的面积。只是使用了单调栈的方法来做。
2024-06-04 14:33:32
316
原创 leetcode刷题
我的思路是停留在了最大值,不知道怎么处理了,其实不用管是不是最后一个,无脑遍历两遍就行了。其中计算雨水面积要横向计算,不能只看某一个竖列(我就卡在了这一步,因此没有做出来)。当然遍历有两种方式,一种是扩充数组;相当于把上一个题的数组又遍历了一遍。只是使用了单调栈的方法来做。
2024-06-03 23:29:16
129
原创 leetcode刷题
carl通过vector<bool> used 的方式做哈希表,一样的。去重的方法不能使用之前的方法了,因为不能改变原始顺序。所以引用undered_set来做去重操作。通过unordered_set的方式来去重。剪枝还是不够熟练,得再多想下。
2024-05-31 12:44:43
303
原创 leetcode刷题
本质就是求最长公共子序列,然后用两个字串的大小分别减去最长的子序列大小再相加,就是最终结果。以下代码初始化有一些问题。两个字符串的删除操作。
2024-05-30 23:04:39
181
原创 leetcode刷题
还是要搞清楚,dp[]的含义,要不然想了很久,一开始方向就搞错,一开始以为dp[i]代表的就是从0到i的最大和,而carl的思路是以i为结尾的最大子序列和。上一题由于需要连续,所以只能从左上角的位置+1,来更新。本题不连续,只要包含就行,所以可以根据左上角,上方,左方联合推出来。把题目搞清楚了,发现和上一个题一模一样,其实就是在求最长公共子序列。本地与上一题类似,不同点在于dp[i][j]表示的内容不一样。首先要搞清楚什么是子序列,不一定是连续的。之前通过贪心的方法做,本次使用dp。
2024-05-28 20:36:32
252
原创 leetcode刷题
只是在递推的时候,需要使用两层for循环。因为每次求dp[i],都需要和前面每一个dp的状态进行对比。dp[i] 代表从第0个数据到第i个数据,最大的子序列。比上一个题目要简单些,因为是连续,所以只需要一层循环。
2024-05-27 22:58:05
255
原创 leetcode刷题
在不持有股票的情况下,又细化分了两种情况,一个是前一天就已经不持有了,一个是当天才卖出。这样做的目的是可以区分出冷冻期。因为卖出之后,才会有冷冻期。只需要在卖出的时候,多减去手续费就可以了。最后还多了一种状况就是冷冻期。
2024-05-27 15:04:16
131
原创 leetcode刷题
(本来我自己的想法是设置数组的长度是3,代表不持有,第一次持有,第二次持有,还有尝试不知道对不对)其实类似,只是dp数组的状态又多了几种情况而已。和上一题差不多,进一步扩充了数组的维度而已。买卖股票的最佳时机III。买卖股票的最佳时机IV。
2024-05-26 22:02:12
527
原创 leecode刷题
持有股票有两种可能,一是前一天已经持有了dp[i-1][0],二是前一天没有持有,今天购入股票(即当天买的,由于可以买多次,并非第一次买,所以手里的钱不一定是0,而是dp[i -1][1], 所以最大价值就是dp[i -1][1] - prices[i]), 选最大值就可以。不持有股票也有两种可能,一是前一天就没有持股票dp[i - 1][1], 二是前一天持股票了,今天卖了(即dp[i-1][0]+prices[i])dp[i][1]代表第i天不持有股票的情况下,最大的收益。买卖股票的最佳时机I。
2024-05-26 15:16:59
294
原创 leetcode刷题
如果要偷第i家,那么最大价值是d[i - 2] + nums[i]第二种情况是不考虑第一家,取最大值。最后比较两个最大值,选最大的。把线性数组连成了一个环,所以只需要分情况讨论就可以。dp[i] 代表偷到第i家,能偷到的最大价值。第i家的最大价值和前一家、前两家有关系。第一种情况是不考虑最后一家,取最大值。如果不偷,那么就是d[i - 1]
2024-05-25 19:00:16
423
原创 leetcode刷题
多重背包和01背包的区别在于:对于每个不同的物品,有一个数量限制,既不是只能用一次,又不是可以无限使用。注意是需要词语的顺序,因此这是一个排列问题,所以外层循环是背包,内层循环是物品。解法比较简单,就是把每个物品拆分成单个物品,然后就转换为了01背包问题。(这个递推还是挺抽象的,不太好理解)
2024-05-25 16:10:54
342
原创 leetcode刷题
递推公式就是dp[j] += dp[j - nums[i]];更新数组时,dp[j] 指的是如果不放这个新的数,原本有多少种方案,再加上dp[j - nums[i]]代表如果把这个数放进去,有多少种新的方案,总和就是更新后的数组。也是把数组分成两堆,一堆是负数,一堆是正数。本质上是把石头分成两堆,使得两堆石头的总重量最相近。和之前的题类似,只是背包换成了二维的。dp[j] 代表容量为j的背包,有多少种存放方案。初始化,dp[0] 初始化为1,代表只有一种情况。接下来就简单了,一样的套路。
2024-05-23 15:23:13
111
原创 leetcode刷题
如果背包大于第i个物品的重量,能放下,则可以选择替换之前的物品或者不替换(替换的标准在于最后的价值是否最大,这样就保证了每次更新,当前容量的背包都是最大的。d[i][j] 表示 从0--i个物品中进行选择,在容量为j的背包中能取到的最大值。如果背包容量小于第i个物品的重量,放不下,不用更新。01背包基础原理搞懂了,但是应用太难套了。只需将第一行和第一列进行初始化就可以。可以先遍历背包,也可以先遍历物品。一维-----动态数组。
2024-05-16 15:40:54
380
原创 leetcode刷题
递推: j * (i - j) j * dp[i - j] he。dp[i] 表示 个数为 i 的树中,有多少不同的二叉搜索树。dp[i]的含义:把i拆分后,可以得到的最大乘积。递推:分别取第i个作为根节点,i左右两边的数量乘积。
2024-05-15 21:41:25
151
原创 leetcode刷题
不同路径更新每一个格子,格子的数值就是到达该格子的方法数,迭代策略就是上面的数值+左面的数值。int uniquePaths(int m, int n) { vector<vector<int>> result (m, vector<int>(n)); result[0][0] = 1; for(int row = 0; row < m; row++){ for(int col = 0
2024-05-15 11:42:22
244
原创 leetcode刷题
模板不变,只是把返回条件进一步改变了。本来是按照path大小返回,由于这个可以重复并且不限大小,因此需要按照总和这个标准来返回。如果总和大于target,则返回,如果相等,添加到result里再返回。(复杂,需要区分同一树枝使用过和同一树层使用过的区别)used 数组是巧妙的点,用来记录访问过的数据。按顺序从大到小排列。
2024-05-13 22:15:08
206
原创 leetcode刷题
虽然是暴力解法,但还是可以通过剪枝操作降低时间复杂度。比如该问题,如果后续剩余可以加入的元素比现有的少了,就不需要再遍历了。回溯其实和递归是相辅相成的,有递归就一定有回溯。只是有些题目用到的到,有些题目用不到。回溯其实也是暴力解法,只是有些题目只能暴力解决。回溯问题其实就是类似于n叉树的遍历。
2024-05-13 19:16:27
123
1
原创 leetcode刷题
单调递增的数字暴力方法bool mode(int n){ int pre = 9; while(n){ if (n % 10 <= pre){ pre = n % 10; n = n / 10; } else{ return false; } }
2024-05-11 16:41:43
83
原创 leetcode刷题
首先按照左区间进行排序,维护一个range表示重叠区间的左右边界,不断更新这个边界就可以。对于前面已经排好的数据,插入一个比自己小的,不会影响他们之间的相对顺序。如果新的气球左区间在这个range内,就不需要新的箭。五元、十元都是固定情况,二十元分两种情况。(优先使用十元纸币)先按照身高从大到小排列,再根据第二个属性进行调整。贪心真是神奇,简单的感觉不是贪心,难的想不出来。插入的时候前面都是比自己大的,所以不用管。只有三种纸币,所以分三种情况。
2024-05-09 17:19:54
385
原创 leetcode刷题
从小到大排序,把首元素反转,首元素如果是负数,反转之后最大。首元素是正数,反转之后损失最小。遍历每一个加油站,看能否当作起点,如果可以,看能否走一圈。不能同时考虑一个孩子两边的情况。两边的情况要单独考虑。(重复以上步骤k次)其实也算是贪心思路。k次取反后最大化的数组。
2024-05-08 23:43:44
165
原创 leetcode刷题
只需找到每次可以跳过的最大范围,在这个范围内遍历,更新该范围,如果在更新的过程中范围超过了数组的长度,那么可以到达最后,如果更新完毕(即循环结束),还没有到达最后,那么就没有成功。类似摆动序列,但是比摆动序列简单(摆动序列需要前后的斜率),只需要找到斜率上升的点就可以累加利润了。
2024-05-08 12:55:13
110
原创 leetcode刷题
先拿到一个饼干,然后把这个饼干分配给能满足的人,最后都分完,一定是最大的。本质就是尽可能多的把饼干分出去,因此把饼干从小到大排序,从小的开始分配。
2024-05-07 21:54:51
258
原创 leetcode刷题
计算每个节点的高度,再使用先序遍历,向下递归如果遇到不平衡的子树,直接返回false,如果都遍历完成,返回true。(小trick:不用记录层数来统计是否是最后一层,每一层都保留,那么上一层一定会将下一层覆盖,最后返回即可)另外是否使用回溯:当需要关注具体的路线的时候,需要使用回溯,如果只是需要从整体把握,非回溯就能搞定。不同点在于:求深度是后序遍历,无法知道此节点是否是最左下的。(小trick2:通过右—》左的顺序入队,那么最后一个就是要求的点)而求该题需要关注具体的路线,因此要使用回溯的方法。
2024-04-21 21:52:40
194
原创 leetcode刷题
(自己的理解:像是析构函数,在收回内存后,调用析构函数。而回溯,其实就是我们重写析构函数的过程。回溯,其本质就是递归之后返回的过程。只是需要在返回后,重写一段逻辑。递归中稍稍带有一点回溯,理解了之后并不难。
2024-04-19 20:10:31
161
1
原创 leetcode刷题
和最大深度求法类似,只是需要考虑如果根节点只有一棵子树的时候,不能返回子树的最小值了,应该返回最大的。层序遍历,遇到的第一个叶子节点的深度即为最小深度。(以上两种方法的时间复杂度都是O(n))只是为什么时间复杂度为O(ln*ln)层序遍历法:每遍历一层,深度加一。特殊方法:根据满二叉树的性质计算。
2024-04-18 22:28:23
103
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人