自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode刷题

终于到了n皇后问题,久仰大名,终于第一次解决了,其实也没有那么难。

2024-06-06 22:57:53 75

原创 代码随想录一刷总结

自从读研后,感觉空落落的,没有明确目标,每日干点这个干点那个。重新规划,重新起航,做一个有规律,有计划执行力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刷题

单调栈用来记录连续变化的数据,按照某一个顺序来记录。

2024-06-03 21:13:19 259

原创 leetcode刷题

思想太妙了,用二维数组来表示。dp[i][j]表示i到j是否是回文串,这样就可以做递推公式了。

2024-05-31 18:28:43 183

原创 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[i][j]的含义是不同子串到i与主串到j有多少种相同的方案。和之前的序列问题类似,代码基本不变。

2024-05-30 11:18:46 370

原创 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刷题

不只是只能爬1、2阶楼梯了,而是一次可以爬最大m阶楼梯。需要注意初始化,以及返回条件。完全背包,思路还是一样的。

2024-05-24 15:11:03 226

原创 leetcode刷题

完全背包的状态是由上一个状态和左边的状态推出来的,因此先遍历背包,还是先遍历物品都可以。

2024-05-24 10:13:49 340

原创 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刷题

使用模板,之前的模板是只收集叶子节点,该题目就是收集这个路程中所有的节点。是之前组合II去重,和子集的结合体。

2024-05-15 11:39:58 392

原创 leetcode刷题

模板不变,只是把返回条件进一步改变了。本来是按照path大小返回,由于这个可以重复并且不限大小,因此需要按照总和这个标准来返回。如果总和大于target,则返回,如果相等,添加到result里再返回。(复杂,需要区分同一树枝使用过和同一树层使用过的区别)used 数组是巧妙的点,用来记录访问过的数据。按顺序从大到小排列。

2024-05-13 22:15:08 206

原创 leetcode刷题

在返回的结构上加上一个判断就可以。一样的套路,只是写的太繁琐了。

2024-05-13 19:18:09 201

原创 leetcode刷题

虽然是暴力解法,但还是可以通过剪枝操作降低时间复杂度。比如该问题,如果后续剩余可以加入的元素比现有的少了,就不需要再遍历了。回溯其实和递归是相辅相成的,有递归就一定有回溯。只是有些题目用到的到,有些题目用不到。回溯其实也是暴力解法,只是有些题目只能暴力解决。回溯问题其实就是类似于n叉树的遍历。

2024-05-13 19:16:27 123 1

原创 leetcode刷题

确定i 和 dp[i] 的含义。debug时把结果打出来。

2024-05-13 15:16:46 99

原创 leetcode刷题

将有序数组转换为平衡二叉树。把二叉树转换为累加树。

2024-05-11 17:17:28 297

原创 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刷题

二叉搜索树的最近公共祖先。我真垃圾啊,写这么多if。二叉搜索树中的插入操作。

2024-05-10 21:55:08 257

原创 leetcode刷题

二叉搜索树的最小绝对值。二叉树的最近公共祖先。

2024-05-10 20:33:55 211

原创 leetcode刷题

【代码】leetcode刷题。

2024-05-10 20:29:00 109

原创 leetcode刷题

【代码】leetcode刷题。

2024-05-10 16:32:57 209

原创 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关注的人

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