自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法题60天总结

暑期实习时每天摸鱼的主角就是当天的算法题任务,从数组链表的没啥难度,到哈希表“X数之和”的挫败,再到字符串栈的巩固提升,二叉树是痛苦的,但是写着写着发现也就是在遍历上玩花活,迭代法也没有当初想象的那么难,用一个栈模拟递归就行了;贪心是最痛苦的,因为没有套路或者框架可依,代码非常简单,思路却需要灵光一现;最后单调栈困难确也固定。走到这并不意味着结束,图论不管在面试还是笔试中都有被考察到,在继续跟着carl哥探索图论的同时,我也要好好地从头开始将老路走一遍,不仅仅是复习随想录中的题,还要发散思维,举一反三。

2023-09-09 18:24:07 211

原创 算法题打卡day60-单调栈 | 84.柱状图中最大的矩形

状态:查看思路Debug后AC。

2023-09-09 18:10:03 231

原创 算法题打卡day59-单调栈 | 503.下一个更大元素II、42. 接雨水

状态:查看思路后AC。

2023-09-08 11:40:30 272

原创 算法题打卡day58-单调栈 | 739. 每日温度、496.下一个更大元素I

状态:暴力超时,查看思路后AC。状态:查看思路后AC。

2023-09-07 17:15:01 297

原创 算法题打卡day57-编辑距离 | 647. 回文子串、516.最长回文子序列

状态:查看思路后AC。

2023-09-06 09:51:21 226

原创 算法题打卡day56-编辑距离 | 583. 两个字符串的删除操作、72. 编辑距离

综合了前面几题,在不同的情况下要考虑增、删、改三种情况,对于多个数的求min技巧get(min({num1, num2, num3});和查找子序列的操作类似,但是考虑的是删除操作。状态:查看思路后AC。状态:查看思路后AC。

2023-09-05 15:49:46 473

原创 算法题打卡day55-编辑距离 | 392.判断子序列、115.不同的子序列

和最长公共子序列相似,不同之处在于这一道题只有母序列(较长的序列)可以进行删除操作,体现在遍历中就是除了左上方之外,上方和下方只有一个可以转移过来。状态:查看思路后AC。

2023-09-05 15:27:58 156

原创 算法题打卡day53-动态规划 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

这道题是研一期间刷的题目,也就是算法导论中的例子,整体思路和昨天的题很像,区别在于转移方程。注意,也要知道怎么样可以把这个公共子序列给提取出来。之前用过贪心思路,但是动态规划的思路更容易想到,注意对res的使用。状态:查看转移方程后AC。状态:查看思路后AC。

2023-09-02 10:55:26 247

原创 算法题打卡day52-动态规划 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

【代码】算法题打卡day52-动态规划 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组。

2023-09-01 12:58:04 155

原创 算法题打卡day51-股票问题 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

和股票问题二一样,区别在于卖出股票需要交手续费,所以最后的答案就不一定是dp[len-1][1](卖出),因为可能存在手续费高于收益的情况,所以最终答案需要比较。需要添加一个冷冻期状态和一个表示冷冻期状态的今天卖出不持有状态。

2023-08-31 14:33:41 275

原创 算法题打卡day50-股票问题 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

状态:查看索引含义和初始化思路后AC。状态:思路正确,对k的偶数判断有误。

2023-08-30 17:06:56 194

原创 算法题打卡day49-股票问题 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

与第一题的唯一区别就在于转移方程中dp[i][0]的状态变化,也就是第i天持有股票的最大收益,因为第一题只能买一次,所以如果前一天不持有今天持有的话一定是-prices[i],但是这道题可以多次操作,所以前一天不持有今天持有的话应该是dp[i-1][1]-prices[i]。

2023-08-29 09:07:30 117

原创 算法题打卡day48-动态规划 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

相较上题的变化就是变成了循环状态,分成三种状态:1. 不考虑头尾;其中情况2和3包括了第一种情况,因为DP算法会根据情况考虑要不要加入开头(结尾)。动态规划数组,当前节点偷和不偷的最大收益(dp[2]),二叉树遍历方法:后续遍历。没啥好说的,按照流程分析即可。状态:Debug后AC。状态:查看思路后AC。

2023-08-28 14:41:04 172

原创 算法题打卡day46-背包问题 | 139.单词拆分(多重背包)

状态:回溯超时,查看背包思想后AC。

2023-08-27 13:47:32 121

原创 算法题打卡day45-背包问题 | 70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

除了常规的可以爬一或二级台阶,当题目稍微修改一下,变成可以爬m级台阶,之前的DP思路就有局限(dp[i] = dp[i-1] + dp[i-2),为了通杀这类问题,可以将题目转换为完全背包问题,可以爬的楼梯级数就是背包中的物品,楼梯总数就是背包,注意例如五级台阶1,2,2和2,2,1是不同的方法,所以类比昨天的组合总数问题,需要先遍历背包,再遍历物品,时间复杂度。注意转换为完全背包后的先物品再背包和先背包再物品的遍历方式在实现上的细节问题,这里将两种代码都放上。状态:查看思路Debug后AC。

2023-08-25 11:04:40 160

原创 算法题打卡day44-背包问题 | 518. 零钱兑换II、377. 组合总和Ⅳ

与上一题的区别在于组合的顺序问题,允许[1, 1, 2]和[2, 1, 1]算作两种不同的组合。完全背包问题和01背包在描述上的区别是:完全背包中的物品可以被无限使用;在代码上的区别是:遍历顺序中都是从小到大遍历,需要注意内外层的嵌套顺序要根据题目适时调整。状态:Debug后AC。状态:查看思路后AC。

2023-08-24 10:24:16 111

原创 算法题打卡day43-背包问题 | 1049. 最后一块石头的重量II、494. 目标和、474.一和零

计算其中一堆的最大重量,因为sum/2向下取整,所以dp[target]肯定是重量较轻的那一堆,最后的答案就是重量较大的那一堆减去dp得到的这一堆,也就是(sum-dp[target]) - dp[target]。不要因为有m和n的限制就觉得这是多重背包,这里的m和n只是不同维度上的限制,题目本质上还是01背包(但是怎么关联上还是有困难啊)。原题的回溯方法比较符合直觉,很难在没有做过的情况下和01背包或者说分割等和子集的方法联系起来。,k是字符串数组的长度,空间复杂度。状态:查看思路后AC。

2023-08-23 10:32:19 106

原创 算法题打卡day42-背包问题 | 416. 分割等和子集

背包问题根据物品数量和取用方式的不同可以分成01背包(物品只有一个),完全背包(物品有无数个),多重背包(物品的个数不相同)和分组背包(按组打包,每组最多选一个)。重点掌握01背包和完全背包就好。有很多问题不会直接以背包的形式来考察,所以实际面对问题可能要经历一个先转换成背包问题的思考过程。下面先对这两个背包用五步法来进行分析。

2023-08-22 10:23:32 97

原创 算法题打卡day41-动态规划 | 343. 整数拆分、96.不同的二叉搜索树

+j) { 转移方程 }};3. dp[0] = 1, j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量;3. dp[0], dp[1]没有初始化的意义,dp[2] = 1;1. dp[i]表示在第i处的最大拆分乘积;1. dp[i]表示在第i处的二叉树个数;5. 举一些例子后可以通过。5. 举一些例子后可以通过。状态:查看思路后AC。状态:查看思路后AC。

2023-08-21 16:57:26 120

原创 算法题打卡day39-动态规划 | 62.不同路径、63. 不同路径 II

这道题是在上一题的基础上加入了判断条件,需要注意的是初始化第一行第一列的时候,如果有障碍物,那么后面的就是0。一步一步跟着步骤分析不难,注意一下初始化就行。状态:没有AC,查看问题后AC。

2023-08-19 17:15:39 828

原创 算法题打卡day38-动态规划 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

这道题有一个理解上绕的是是要走到楼顶,如果把索引i的含义当作是每个阶梯到楼顶的最小花费,思路会变得很绕,因为可以是前一个阶梯直接到,也可以是前两个阶梯加上这个阶梯的花费,很混乱。所以下标i的含义是到达该阶梯的最小花费,把最高的楼顶当作一个cost为0的阶梯。这样初始化的时候就需要len+1个元素。可以用递归写,也可以用动态规划来写,使用动态数组之后发现可以用两个值进行替代。状态:索引下标和状态转移方程有都问题。状态:Debug查看转移方程后AC。状态:Debug后AC。

2023-08-18 10:32:02 109

原创 算法题打卡day37 | 738.单调递增的数字、968.监控二叉树

所以应该是从叶子结点出发,将叶子节点的父节点装上摄像头,根据这个方向,可以使用左右中的递归顺序,这样可以在回溯的时候对中间节点进行逻辑判断,为此我们需要对每个节点的状态进行讨论,可以用3钟状态来描述:无覆盖0,有摄像头1,被覆盖2。需要注意的是空节点的状态应该是2。这个方法从局部出发,如果说想要从这个局部最优扩展到全局最优,需要使全局最优的答案可以复用局部最优,就只能从后往前判断而不是从前往后,和重叠区间有一点点逻辑上的类似,但是不好描述,用心体会。状态:查看思路后AC,可能会遗忘。

2023-08-17 15:39:46 135

原创 算法题打卡day36 | 435. 无重叠区间、763.划分字母区间、56. 合并区间

同样是确定一个维度(排序),然后和射箭/无重叠区间类似。注意要在遍历结束后把最后一个插入进去。首先需要对各个字母的首次/最后出现时间进行统计,之后就是合并区间问题。和昨天的射箭问题一样,区别就是res的初始状态一个是1一个是0。状态:Debug后AC。状态:Debug后AC。

2023-08-16 13:33:44 80

原创 算法题打卡day35 | 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

本题要注意两点,首先是两个维度先确定哪一个,自己思考的想法是先确定前面的人数,也就是第二个,但是这样排序过后会发现在考虑身高时之前确定的维度被打乱,没有起到什么作用。首先,数组按照某一个维度进行排序的方法要掌握,其次,插入较多的算法,数据结构使用list效率比vector高,最后就是迭代器的使用。很符合直接的算法是记录5,10,20的面值个数(其实不记录20也可以),然后根据不同的面值进行讨论处理,这里需要注意的是,顾客给20有两种找零方式,如果有10块,可以10+5,如果没有10块,可以5*3。

2023-08-15 13:36:01 125

原创 算法题打卡day34 | 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果

将数组按照绝对值大小从大到小排序,从前向后遍历如果遇到负数将其变为正数,k--,如果遍历完成之后k不为0,就反复转变绝对值最小的元素知道把次数用完,最后对数组求和即可。状态:暴力AC,贪心没思路。状态:了解思路后AC。状态:查看思路后AC。

2023-08-14 16:49:47 83

原创 算法题打卡day32 | 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

状态:查看思路后AC。

2023-08-13 22:20:59 111

原创 算法题打卡day31 | 455.分发饼干、376. 摆动序列、53. 最大子序和

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。全局最优:选取最大“连续和”这道题还有优化的空间,就是使用贪心算法,使用贪心算法要考虑三种情况。解题思路是从胃口小的先开始满足,时间复杂度。状态:暴力解法超时。

2023-08-11 14:37:31 98

原创 算法题打卡day30 | 332.重新安排行程、51. N皇后、37. 解数独

我还能说什么呢,时间复杂度。状态:抄代码都看不明白。

2023-08-10 13:24:46 38

原创 算法题打卡day29 | 491.递增子序列、46.全排列、47.全排列II

这道题和之前全排列的区别就在于不是对同一层的重复元素进行去重,而是去除同一父节点下的重复使用元素,为了达到这个目的,需要使用哈希来判断是否重复,注意到数组中值的大小是-100到100之间,因此可以直接利用哈希数组进行判断。注意全排列和组合(子集)的最大区别在于,全排列的回溯展开每次都是从0开始而不是startIndex,因此需要一个used数组来对已经使用过的节点进行记录,值得注意的是在pop之后,used数组也要进行更新。这里的去重逻辑和组合中的树层去重逻辑类似,注意细节。状态:查看思路后也没AC。

2023-08-09 14:58:14 49

原创 算法题打卡day27 | 39. 组合总和、40.组合总和II、131.分割回文串

基本的回溯方法遵循回溯模板,需要注意的是回溯中的startIndex是从当前i继续而不是i+1,因为组合中的数字允许重复。在基本回溯的过程中,终止条件是当前层的sum大于target,但如果之后的数比当前数大,那么后续的递归是多余的。但是这道题还有另一个难点,那就是数组中会出现重复的元素,同一位置的元素不能重复使用,同时最终答案也不能出现重复path,这就是一个判断树层去重(而不是树枝去重)的过程,为此加入一个used数组作为辅助判断。状态:有思路但是没有代码实现,动态规划判断回文没想到。

2023-08-07 21:57:01 120

原创 算法题打卡day25 | 216.组合总和III、17.电话号码的字母组合

这道题和昨天的组合题代码框架相似,剪枝优化的过程相比组合题多了对sum大于target值之后不用继续遍历的判断。,其中 m 是对应四个字母的数字个数,n 是对应三个字母的数字个数,空间复杂度。状态:AC但没有剪枝优化。

2023-08-05 21:37:30 85

原创 算法题打卡day24 | 77. 组合

而剪枝优化的思路就是考虑在这个过程中有哪些是可以排除的,首先是遍历的范围,如果k的个数大于当前层剩下的节点数,那就不用再进行遍历了,因为全部加上也不够(等于的话就是全部加上)。状态:查看思路后AC,剪枝优化的思路想不出来。

2023-08-04 20:16:27 34

原创 算法题打卡day23 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

不能简单地对节点进行是否在区间内的判断就返回空节点。这样会遗漏掉左孩子右子树和右孩子左子树中符合条件的节点。至于如何将相关节点放到对应的位置,要下层节点返回,上层节点接收。状态:Debug后AC。状态:查看思路后AC。这道题的关键在于发现。

2023-08-03 23:16:18 92

原创 算法题打卡day22 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

利用二叉搜索树的特性进行分析,不需要对中间节点进行操作,所以没办法区分前/中/后序遍历。状态:没有思路,还是236的套路。状态:比上一题复杂得多。

2023-08-02 21:45:32 96

原创 算法题打卡day21 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

状态:插眼状态:插眼状态:插眼。

2023-08-01 22:19:36 143 1

原创 算法题打卡day20 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

状态:查验状态:插眼状态:插眼状态:插眼。

2023-07-31 21:49:35 65

原创 算法题打卡day17 | 513.找树左下角的值、112. 路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

该题也用到了回溯法,但是值得注意的是回溯法不一定需要进行路径的记录。更进一步说的话,回溯法本身和路径记录没有关系,因为利用递归进行遍历本身就包含了回溯的过程,区别在于普通的遍历考虑的是当前节点和子节点的关系,而回溯则要求还要考虑和其父节点的关系。所以说,回溯法中,具体是怎么控制前进,抑或是怎么得到答案,全在于如何发现可以终止和进行回溯的条件是什么。状态:想到了要用到回溯法,但是困在了之前的套路,不知从何下手。状态:无思路,需要后续练习。状态:Debug后AC。状态:Debug后AC。

2023-07-31 21:25:28 157

原创 算法题打卡day17 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

通过这道题,对于树的「高度」和「深度」有了一些体会。高度是相对于叶子节点来说,大部分的递归都需要先走到叶子节点处再向上生长,这就有了高度的概念;而深度则是相对于根节点,在使用迭代方法计算二叉树高度的时候,程序从根节点往下走(层序),就有深度的感觉。可以继续利用回溯,回溯的关键就是要用一个数组来记录路径,然后每一次递归操作都要有一次路径的吐出操作(路径的增加在进入递归函数的时候会有)。但是总体思路上是「确定递归终止条件」->「递归前进方式」->「回溯」。状态:递归了解思路后AC,迭代没有尝试。

2023-07-30 10:21:01 98 1

原创 算法题打卡day16 | 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

有了昨天的铺垫,这道题用层序反而感觉在偷懒,只能说二叉树的核心还是要对递归理解透彻,理解了具体的递归过程,想要改写成层序选用合适的配接器(栈、队列)就好。这里递归的顺序是后序遍历,其实左右子树的顺序没有影响,主要是根节点的判断是在左右两子树的后面。如果没有单独划分出去进行一步一步推演,直接在一个函数中写出最终简化版本,很容易给人一种简单但是复现的时候卡在各种地方的感觉。状态:迭代AC,递归查看思路后AC。状态:迭代AC,递归没有。状态:迭代AC,递归没有。状态:迭代AC,递归AC。

2023-07-27 09:22:46 46 1

原创 算法题打卡day15 | 102.层序遍历、226.翻转二叉树、101.对称二叉树

层序遍历的思路其实现在看来和迭代法做前序遍历很接近。都是利用配接器规范遍历的顺序。不同的是层序遍历是队列。上面的题目都是在层序遍历的这个框架下进行的一些变化,稍作思考变化即可。没什么好说的,实际推演一下交换的流程即可。递归进行镜像比较,注意递归的终止条件判断较为复杂。状态:了解思路后递归迭代均AC。状态:Debug后AC。

2023-07-27 00:05:03 181 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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