自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营总结

我还是觉得孰能生巧,这两天开始重刷二叉树部分,发现之前觉得难的,现在已经会了,之前觉得很难的,现在虽然做不出,但是看了思路和代码很快就掌握了,所以相信下一次再刷,我就能真正掌握了吧,加油!

2024-03-19 13:15:43 327

原创 代码随想录算法训练营第14天|递归遍历 非递归遍历

之前已经刷过二叉树的题目了,当时的我连觉得遍历都很难,现在已经觉得很简单啦!

2024-03-19 13:04:54 351

原创 代码随想录算法训练营第13天|239.滑动窗口最大值

至于在外部要获取这个队列的最前面的元素,由于是外部创造对象来调用这个自定义双向队列的函数,所以这时候也得提供接口获得队列的队首元素。小女孩又碎了一次,这道题的思路还挺简单的,就用一个map来记录元素以及它出现的频次,然后我们再用小根堆来排一下序,但是我不熟悉priority_queuey已经map的用法,写起来磕磕绊绊的...o(╥﹏╥)o。

2024-03-18 16:35:25 345

原创 代码随想录算法训练营第11天|20.有效的括号 1047.删除字符串中的所有相邻重复项

栈类的题目都很神奇,这道题分有不有效有三种情况,一种是左括号多了,一种是右括号多了,一种是左括号和右括号不匹配。我们设置一个栈来放s[i]所对应的右括号,如果s[i]==‘{’,那么就在栈里放‘}’,依次类推.......假如遇到的是一个右括号,那么就看看它和栈顶元素是否匹配(因为栈顶元素对应的是最近的一个左括号),如果不匹配就返回false,对应的是左括号和右括号不匹配的情况。假如说还没把s遍历完,栈就为空了,说明这时候右括号多了,也返回false,最后怎么判断左括号多了的情况呢?

2024-03-17 14:34:59 323

原创 代码随想录算法训练营第10天|232.用栈实现队列 225.用队列实现栈

我觉得双栈实现队列实在是妙极了,用一个栈表示入栈,用一个栈表示出栈,如果要push元素进这个“队列”,那么就把元素放到入栈的栈里,如果要pop元素,那么就把入栈里面的所有元素都放到出栈的栈里,因为本来栈是先进后出,但是现在把入栈的元素全部移到出栈里面,那么顺序负负得正,就又形成队列的顺序了,值得注意的是,如果出栈里面的元素还不为空,那么就不需要挪动,因为要是出栈里面的元素不为空,说明还有元素可以pop()出去(还是跟队列的顺序一样),如果出栈里面的元素为空,那么才进行挪动。

2024-03-17 11:29:38 192

原创 代码随想录算法训练营第60天|84.柱状图中最大的矩形

这道题要求柱状图中最大的矩形,对于给定的数组heights,我们对于其中的每一个元素,我们要找到这个元素左边比它小的,以及右边比它小的元素,然后把这两个下标相减就得到了区间的范围,也就是我们现在遍历到的元素它可以延展的范围,相当于矩形的宽,而遍历到的元素的数值就是矩形的高。那就是在第一个元素左边又添加一个元素0,对于最后一个元素,我们要怎么找到右边比它小的元素呢?那就是在第一个元素右边又添加一个元素0,所以就相当于我们在给定 的数组heights的基础上,在heights的头和尾部各添加一个0。

2024-03-17 10:41:48 170

原创 代码随想录算法训练营第59天|496.下一个更大元素II 42.接雨水

这道题特殊的点在于它有点像环,后面的元素可以再从前面的元素找,我看了卡哥的视频,卡哥是根据取模来取的,但是他会多了没必要的赋值,我还是按照我最初的想法写吧,我是跟之前单调区间一样用数组来记录最大元素,因为后面的元素可以再从前面的元素找,所以我再加一次循环,这次循环跟上一个循环的区别就在于没有了s.pop(),因为这次循环是要查缺的,所以就只需补上漏了的值就好。

2024-03-16 15:22:41 313

原创 代码随想录算法训练营第58天|739.每日温度 496.下一个更大元素I

这道题是开始单调栈的第一题,单调栈好神奇,对于这道题,我们先设置一个栈,这个栈存的是已经遍历过的元素的下标,我们遍历temperatures的数值,如果temperatures[i]>temperatures[s.top()],即现在的元素比栈顶所对应的元素大,即找到了第一个大于栈顶所对应元素的值,这时候我们记录下标。如果现在的元素小于等于栈顶的元素,那就把当前元素对应的下标放入栈中。通过这种操作,我们会发现栈是一个从小到大的单调栈,因为大于的元素我们就记录距离,只有小的元素才把下标放入栈内。

2024-03-16 11:15:57 211

原创 代码随想录算法训练营第57天|647.回文子串 516.最长回文子序列

唉这道题让我用dp我是会不了一点啊啊啊,这道题的dp[i][j]表示从给定字符串的第i个位置到第j个位置这一部分的字符串是不是一个回文串,如果s[i]==s[j],并且j-i<=1,那么dp[i][j]=true,如果j-i>=1,那么如果dp[i+1][j-1]==true的话,那么dp[i][j]=true,从第二种情况来看,我们可以看出本题的遍历顺序是从下往上,从左往右,因为要知道dp[i+1][j-1]的值,是处在当前位置的左下方,所以可以知道遍历顺序。

2024-03-15 13:26:58 329

原创 代码随想录算法训练营第55天|583.两个字符串的删除操作

word2[j-1],那么这时候就要删除元素了,可以删除word1[i-1]也可以删除word2[j-1],也可以两个都删除,就要看哪种方法使得删除的元素小了,所以dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+2)。这道题我看弹幕说“秒了”,怎么大家都那么厉害,然后看到“最长公共子序列”,好家伙,又是它,还是得转换一下思路,求最少得删除多少个元素可不就是先求最长的公共子序列,然后两个字符串分别减去最长公共子序列的长度吗,所以代码。

2024-03-14 22:18:11 331

原创 代码随想录算法训练营第54天|392.判断子序列 115.不同的子序列

这道题要求的是判断子序列,返回的是bool值,我还在想dp?bool?平时都是dp和int呀,这怎么和dp扯上关系,结果是要换个角度看问题(和不相交的线很像),又和最长公共子序列一样了,我们以目标字符串为基准,看看目标字符串和要被查找的字符串的最长公共子序列是否和目标字符串的长度相等,如果相等就说明是子序列,如果不相等就说明不是子序列。

2024-03-14 13:20:44 165

原创 代码随想录算法训练营第53天|1143.最长公共子序列 1035.不想交的线

这道题和718.最长重复子数组很像,这道题多了一个不连续的条件,我还是按照上一道题的思路知道if(text1[i-1]==text2[j-1]),(注意:这里写i-1,j-1是对应text1,text2的下标),dp[i][j]=dp[i-1][j-1]+1,可是不连续的条件怎么表示呢?还是回归到dp数组的含义,dp[i][j]表示数text1的第i个和text2的第j个位置的时候的最长公共子序列的数值,那么,如果text1[i-1]!=text2[j-1],dp[i][j]应该怎么表示呢?

2024-03-13 19:47:16 316

原创 代码随想录算法训练营第52天|300.最长递增子序列 674.最长连续递增序列 718.最长重复子数组

这道题还挺简单的,咱们设置dp[i]表示到第i个数字时的递增子序列的最长的值,那么dp[i]就要遍历从0到i-1的数,也就是看看当前这个数字是否比前面的数字大,如果大的话就看看现在的子序列长度是否会长于前面那个数字代表的子序列长度+1(1是表示加上当前这个数字),如果不会的话就更新最长值。

2024-03-12 22:53:53 454

原创 代码随想录算法训练营第51天|309.买卖股票的最佳时机含冰冻期 714.买卖股票的最佳时机含手续费

这道题因为有了冰冻期所以状态的话会比前面的题多了一个冰冻期的状态,同样的,我现在还是只是知道设什么状态,状态之间应该怎么转换,但是内核还不是很懂。我们把状态分为4中情况,dp[i][0]表示第i天持有股票的最大金额,dp[i][1]表示第i天不持有股票(不包括当天卖出的情况以及冰冻期)的最大金额,dp[i][2]表示第i天当天卖出股票的最大金额,dp[i][3]表示第i天处于冰冻期的最大金额。

2024-03-12 12:47:03 162

原创 代码随想录算法训练营第50天|123.买卖股票的最佳时机III

其实现在我还是不太get得到买卖股票与动态规划的联系,但是我已经get得到这类题的解决通用模板都是跟前一天的状态有关。

2024-03-11 20:32:00 269

原创 代码随想录训练营第48天|121.买卖股票的最佳时机 122.买卖股票的最佳时机II

这道题有一点抽象,我们得用两个状态来表示第i天的情况,dp[i][0]表示第i天持有这个股票时自己的钱,dp[i][1]表示第i天不持有这个股票时自己的钱,dp[i][0]=max(dp[i-1][0],-prices[i]),因为持有股票就相当于说要买股票,要付钱,那么第i天持有股票自己拥有的钱的最大值肯定是买那个价格越低的越好,就要看是之前就买入股票的价格比较低,还是现在买入股票的价格比较低。

2024-03-11 19:10:54 886

原创 代码随想录第47天|198.打家劫舍 213.打家劫舍II 377.打家劫舍III

这道题还挺简单的,有点像前面的爬楼梯,dp[i]表示到第i个房间时能拿到的最多的钱是多少,dp[i]=max(dp[i-2]+nums[i],dp[i-1]),假设在第i个房间抢钱,那么获得的钱就是dp[i-2]+nums[i],假设在第i个房间不抢钱,那么获得的钱就是dp[i-1]。

2024-03-11 14:09:35 360

原创 代码随想录训练营第46天|139.单词拆分

这是做动态规划以来觉得最抽象的一道题了啊啊啊啊啊啊啊啊啊,先留个坑,现在是似懂非懂,没法用语言表述。

2024-03-10 16:35:23 176

原创 代码随想录算法训练营第45天|70.爬楼梯(进阶)322.零钱兑换

这道题我一开始做错了,我做成了完全背包算组合,但是爬楼梯因为次序是有不同的,比如可以先一个台阶后两个台阶,也可以先两个台阶后一个台阶,所以爬楼梯应该是完全背包的算排列数。

2024-03-10 14:16:53 236

原创 代码随想录算法训练营第44天|518.零钱兑换II 377.组合总和IV

今天的这两道题都是以完全背包为理论基础,零钱兑换II是算组合总数,dp[i]表示总和为i的组合数,dp[i]+=dp[i-nums[j]],dp[i]相当于把之前的所有情况累加起来,求组合总数是先遍历物品再遍历背包。

2024-03-09 19:53:52 154

原创 代码随想录算法训练营第43天|1049.最后一块石头的重量II 494.目标和 474.一和零

看到这道题的时候我还是很懵逼,我在想要使哪两块石头碰撞,应该怎么组合,我就会被限制于局部的组合,但是这道题应该是从全局考虑,题目要求的是石头碰撞后剩下最后一块石头的重量,那其实也就是可以把石头分成两堆,求两堆石头重量的最小值,那么我们把石头分成两堆,看看它们的重量是否能达到总和的一半,如果都是总和的一半,那么剩下的最后一块石头的重量也就是0,如果不是的话,就返回两堆石头重量的插值。所以题目就转化为了在给定target=sum/2的背包容量的情况下,求背包价值的最大值。

2024-03-09 17:40:39 280

原创 代码随想录算法训练营第41天|背包理论基础 滚动数组法 416.分割等和子集

这道题神奇的点在于它居然也是动态规划的,我们把背包的容量看成是数的总和除以2,物品的价值看成是数的大小,问题就转化为了求背包容量为数的总和除以2的情况下,是否能够使得物品的最大价值等于数的总和除以2。

2024-03-09 15:32:31 364

原创 代码随想录算法训练营第40天|343.整数划分 96.不同的二叉搜索数

还多了一个dp[i]这是因为要在所有很多情况中找最大值,要不断更新dp[i]的值。这道题Carl哥的解法实在是太牛了,是让我听君一席话胜读十年书的地步,太牛了,怎么可以想得到这个递推公式,dp[i]表示有i个节点的二叉搜索树的数量,然后我们又可以按照顺序,比如给了三个节点,那么分节点1为根节点,节点2为根节点,节点3为根节点的情况考虑,依此类推得到公式。

2024-03-06 22:58:41 151

原创 代码随想录算法训练营第39天 | 62.不同路径 63.不同路径II

这道题我记得之前是用深搜(我到现在自己还没法独立写出,但是用动态规划的话我现在已经回了,其实也就是找出dp[i][j]表示到第i行第j列的路径数量,初始化的话是第一行和第一列都为1,因为到第一行和第一列的点的路径只有1。

2024-03-06 21:28:19 504

原创 代码随想录算法训练营第38天|509.斐波那契数列 70.爬楼梯 746.使用最小花费爬楼梯

这道题很基础,因为做过挺多遍了,这次看卡哥的视频思路更清晰了,原本我会习惯于开一个很大的数组,但是没必要,只需要实时更新dp[i-1]和dp[i-2]就行。

2024-03-06 20:46:29 210 1

原创 代码随想录算法训练营第36天 | 435.无重叠区间 763.划分字母区间 58.合并区间

虽然我已经做了气球的那道题,但是看这道题刚开始还是很懵逼,Carl哥讲解完后,我一整个豁然开朗,这道题求的是要毙掉多少个区间才能使得总的数据里面没有重叠区间,转换一下就是我们要求出有多少个重叠区间,还是跟气球那道题一样,先按照左区间从小到大排序,然后咱们再一个个遍历,假如说现在到达的区间的左区间比上一个区间的右区间大,说明没有重叠,如果比上一个的右区间小,说明有重叠,那么count++,那下一个区间会不会和这两个区间有重叠呢,可以从两个角度考虑。

2024-02-29 18:50:57 348

原创 代码随想录算法训练营第34天 | 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

这道题看到的时候会觉得很绕,关键点在于这道题给的是两个维度,一个是身高,一个是前面比‘我’高的人的个数,假如我们按照前面比我高的个数来排会找不到规律,但是如果按照身高从大到小排,那么我们可以发现这时候只需根据前面比我高的个数来将人的属性挪到对应的位置就可以,因为是从大到小排的,所以不用担心后面的挪到前面来,会导致前面的个数与之不匹配,因为个数是比我高的个数,而比我矮的挪到我前面来,根本不影响我的“前面比我高的个数”。452. 用最少数量的箭引爆气球。

2024-02-28 19:41:55 264

原创 代码随想录算法训练营第33天 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

我只能说贪心类题目真的好抽象啊啊啊啊啊啊,这道题把它抽象成两边找问题就简单,但这个抽象的过程实在太抽象,这道题用Carl哥的思路是,先按从左到右的顺序,如果后一个比前一个大,后一个就在前面一个的基础上加一,然后再按从右往左的顺序,如果前一个比后一个大,那么前一个就在后一个的基础上加一,注意,这时候加一完的结果可能比原来小(考虑到从左往右遍历的结果),所以咱们应该是取原来的值和加一完的结果的较大的那个数。

2024-02-27 21:44:27 279

原创 代码随想录算法训练营第32天 122.买卖股票的最佳时机 II 55. 跳跃游戏

这道题我愿称Carl哥为两行代码的神,这道题其实就是转化为求利润的最大,第N天的利润可以=n-(n-1)+(n-1)-(n-2)+...,就转化为了每两天之间的利润的和,所以只要计算每两天利润和的最大值就可以。

2024-02-26 21:43:00 327 1

原创 代码随想录算法训练营第31天 |455.分发饼干 376.摆动序列 53.最大子序和

正如Carl哥所说的,贪心算法的很多都是靠常识,这道题的常识就是咱们是按照一定的顺序匹配的,可以根据胃口的数组,从后往前(就是从大到小的顺序),匹配饼干的数组,也是按照从大到小的顺序,用index来指向饼干的位置,如果饼干大于胃口,那么indx--,result++,最后返回result就可以。

2024-02-26 20:35:21 396 1

原创 代码随想录算法训练营第30天 | 51.N皇后 37.解数独

这道题没有想象中那么难,难的点在于最后的结果是三维的,回溯函数的参数应该传入二维数组(表示棋盘),然后遍历row那一行的全部列,判断isValid,总体思想其实和前面做的题差不多。

2024-02-24 16:02:28 193

原创 代码随想录算法训练营第29天 | 491.递增序列 46.全排列 47全排列II

这道题有一个要求,就是咱们不能将题目给的vector排序(区别于前面的几道题),所以就不能写if(i>startIndex&&nums[i]==nums[i-1])了,只能用unordered_setuset来判断是树层方面的nums[i]==nums[i-1]还是树枝方面的,如果是树层方面那么要continue,因为树层方面相同会导致组合重复。同时,为了保证递增还得满足nums[i]

2024-02-23 14:38:45 267

原创 代码随想录算法训练营第28天 | 28.复原ip地址 78.子集 90.子集II

这道题是结合之前有一道题也是重复元素的,思路是一模一样,判断条件还是if(i>startIndex&&nums[i]==nums[i-1]),这一步是树层层面的去重,为了避免树枝层面因为nums[i]==nums[i-1]受到干扰,所以加上限制条件i>startIndex,其余的回溯思想跟前几道题一样。这道题比较简单,之前的回溯的题是在结果(叶子结点收割),而子集求的是过程中的每一个集合,所以只需在进入函数后先将上一个函数的结果path加入到结果集里面就可以。

2024-02-23 10:56:59 251

原创 代码随想录算法训练营第27天 | 39.组合总和 17. 电话号码的字母组合

组合总和的这道题的关键在于题目说到元素可以重复利用,所以递归用到的startIndex是i,而不是像前面几道题一样的i+1,剪枝的关键在于排序,由小到大排,那么只要加上一个后总的和大于target那么就可以return掉了。

2024-02-21 16:33:00 343

原创 代码随想录算法训练营第25天 | 216.组合总和III 17. 电话号码的字母组合

这道题和77.组合那道题很像,也是遍历的思想,回溯的思想在于不断地按分支下去搜索,具体看图(好难用文字表达...看图看代码就懂了)

2024-02-20 21:00:19 300

原创 代码随想录算法训练营第24天 | 77.组合

时隔大半个月开始来补打卡训练营了呜呜┭┮﹏┭┮。

2024-02-20 16:04:29 238

原创 代码随想录算法训练营第八天 |344.反转字符串 541.反转字符串II 卡码网 替换数字 151.反转字符串里的单词

这是一道超级无敌简单的题,就是设置两个指针,一个指向头部,一个指向尾部,然后交换这两个元素,接着两个指针同时向中间移动,直到到达中间的位置(i

2024-01-27 22:09:32 268

原创 代码随想录算法训练营第七天 454.四数相加 383.赎金信 15.三数之和 18.四数之和

这道题要求找的是从四个数组中各挑一个元素找加起来等于0的组合的个数,按照常规的暴力解,肯定就是四个for循环遍历,找到了,count++;但是这样子的时间复杂度太高了,所以需要想一下降低时间复杂度的方法,因此有了两两组合的方法,也就是先遍历第一个和第二个的数组,把他们的和以及出现的次数记录在map里面,然后遍历第三个和第四个数组,看看0-(c+d)是否存在map里面,存在的话,count+=记录在map里面的值,两两组合的话时间复杂度就是O的平方,因为是两个for循环。

2024-01-18 23:00:51 329 1

原创 代码随想录算法训练营第六天 | 242.有效的字母异位词 349. 两个数组的交集 第202题. 快乐数

这道题利用字母的ascii码-'a'作为每一个字母元素所对应数组的下标,然后遍历第一个字符串,字符串的字母所对应的位置元素+1,接着遍历第二个字符串,字符串的字母所对应的位置元素-1,如果最后数组里面的元素都是0,那么说明是有效的字母异味词,如果不都是0,比如有的是1(就说明第二个字符串没有这个字母),有的是-1(就说明第一个字符串没有这个字母)。

2024-01-17 23:10:46 438

原创 代码随想录算法训练营第四天 | 24.两两交换链表中的节点 19.删除链表的倒数第n个节点 面试题 02.07. 链表相交 142.环形链表

其实思路还蛮简单的,但我自己想是想不出的,会把自己绕晕。卡哥解决的关键在于引入虚拟节点,这样就可以保证每一次工作的循环条件是相同的。具体的连接方式就是按照图中的一样,把两个看成一组来解决,就是绕了一下然后把cur->2->1的线拉直,然后cur再往后移动两位,如图中的话就是下一次会移动到2。

2024-01-17 20:57:35 411

空空如也

空空如也

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

TA关注的人

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