- 博客(41)
- 收藏
- 关注
原创 代码随想录算法训练营Day48||Leetcode 739. 每日温度 、 496.下一个更大元素 I 、503.下一个更大元素II
(3)查找:.count(key)若存在value返回1否则返回2,与.find的区别是,前者返回的是布尔值 后者返回迭代器,没有找到则返回.end()用于找到数组中某个元素后边第一个比它大(用单增栈)/小(用单减栈)的元素。用了一个unordered_map来储存nums1数组的值和对应下标。循环的东西都与整除取模有关,虽然能想到思路,但是想不到在哪里取模。题解才用存放数组的方式,这里直接存放了nums2中的数据,写法更简便了。栈内元素从栈口到栈底保持单增或单减。栈中存放的是数组下标。
2024-08-29 13:00:04 275
原创 代码随想录算法训练营Day46||Leetcode 647. 回文子串 、 516.最长回文子序列
(取去掉一侧后的最大回文子串数,因为去掉了有可能是回文,但不去掉一定不是回文)dp[i][j]=dp[i+1][j-1]+2(中间的最大长度在加两边的端点)(四)遍历顺序,从左到右,从下到上(因为i j 需要从i+1 j-1推过来)(一)dp[i][j]为从下标i到下标j这一范围内的字符串是否为回文子串。(二)满足当前字符串为回文,或者区间内为回文,dp[i][j]=1。分析递推公式:dp[i][j]=1(一个字母一定为回文)
2024-08-22 00:35:39 313
原创 代码随想录算法训练营Day45||Leetcode 115.不同的子序列 、583. 两个字符串的删除操作、 72. 编辑距离
主要分析一下递推公式:dp[i][j]=dp[i-1][j-1](此为当前遍历的字符相同的情况,此时不需要做删除操作,直接继承前面)dp[i][j]=dp[i-1][j]+1,dp[i][j-1]+1的最小值(此为删除1个word1的当前字符或者删除word2的当前字符,所以在前者的基础上加1)(三)初始化:dp[i][0]=1第一列=1,意思是,当s不为空、t为空时s中必能找到一个子集(空集)dp[0][j]=0,意思是,当s为空、t不为空时,s中本身为空集找不出来一个子集。有了前面做基础,一遍过~
2024-08-21 13:37:12 326
原创 代码随想录算法训练营Day44||Leetcode1143.最长公共子序列 、 1035.不相交的线 、 53. 最大子序和 、392.判断子序列
nums2[j-1]的时候,从[i-1][j]和[i][j-1]两个方向推过来继承的,虽然递推公式麻烦了,但是最后返回的结果可以直接返回最后一个元素了。最长公共子序列的变形题,即判断长字符串中与短字符串公共的最长子序列是否等于短字符串长度即可,可以把最长公共子序列看做一个长字符串的一个子集,看看这个子集长度是否等于短字符串长度,从而推出前者属于后者的子集。(二)递推公式:dp[i]=dp[i-1]+nums[i]或dp[i]=nums[i](一)dp数组含义:到第i个之前,最大子数组的和。
2024-08-20 15:27:31 376
原创 代码随想录算法训练营Day42||Leetcode300.最长递增子序列 、 674. 最长连续递增序列 、 718. 最长重复子数组
(一)dp数组含义:dp[i][j]表示数组下标为i-1作为数组1的结尾,j-1作为数组2的结尾的的当前公共子数组的长度(不是i和j的原因是因为,第0个数需要第-1个数来推,下标越界)比上面那个更简单,上面还需要双指针遍历当前元素前面所有的元素,这个只需要找前一个元素。简单,只不过返回值不是dp数组最后一个元素了,自己做出来AC了。(四)遍历顺序,两个数组地位相同,先遍历谁都行。(三)初始化:全为0。二、 最长连续递增序列。
2024-08-17 13:49:34 293
原创 代码随想录算法训练营Day42||Leetcode 188.买卖股票的最佳时机IV 、309.最佳买卖股票时机含冷冻期、 714.买卖股票的最佳时机含手续费
持股状态可以从保持前一天持股、不持股买入的状态推过来,而不持股的状态又分为卖出后一直没买入,和冷冻期两个状态得来。这题和三差不多,只需要把Ⅲ中的4个状态替换成2k的状态,把分别赋值变成循环赋值即可。可以是保持一直没买入,也可从冷冻期推过来。一遍过简单只需考虑卖出时候扣去手续费就行。最后注意返回值要从三者选最大的返回。二、买卖股票最佳时机(含冷冻期)//dp[][1]保持不持股状态。//dp[][2]不持股状态。//dp[][0]持股状态。一、买卖股票最佳时机Ⅳ。三、含手续费的股票买卖。
2024-08-17 12:33:40 212
原创 代码随想录算法训练营Day41||动态规划 买卖股票最佳时机Ⅰ、Ⅱ、Ⅲ
dp[i][0,1,2,3,4]分别代表了第i天不操作、第一次购入(此后一直持有)、第一次卖出、第二次购入(此后一直持有)、第二次卖出操作。明天都可以买卖,因此这里的dp[i][0]就可以在dp[i-1][0]和dp[i-1][1]-prices[i]中取最大值。这个只买卖一次,与之前的区分开,所以这里的dp[i][0]=max(dp[i-1][0],例如第二次购入可以是在第i-1天第二次购入得来,也可以是第i-1天卖出再买进得来。后一状态就可以根据前一状态下来递推。
2024-08-14 21:38:45 260
原创 代码随想录算法训练营Day39||Leetcode 198.打家劫舍 、 213.打家劫舍II、337.打家劫舍III
第一次接触树形dp。有点复杂,也不算特别难。问题的关键是这题用dp数组控制的是本节点偷与不偷各自的钱数,与以往dp数组把握全局不同,这题由于递归函数入栈出栈,每经历一个节点就会 有一个新的dp[0] dp[1]用于存放这之前的所有数据,不需要特别长的长数组也可以实现更新的操作。易错点是在下面递归函数返回的时候,要把nostolen放前面与dp[0]对应,表示没偷的状态。(二)递推公式:dp[i]=max(dp[i-1](一)dp数组含义:第i个元素前能得到的最大钱数。(四)遍历顺序:从前往后。
2024-08-14 16:35:13 326
原创 代码随想录算法训练营Day38||Leetcode 322. 零钱兑换 、 279.完全平方数、139.单词拆分
这题说用背包根本想不到,甚至我都找不到谁是背包谁是物品,看完了题解以后感觉更像是双指针算法,理解是理解了,但是肯定写不出来第二遍了。(五)如果最后没有更改,说明没有能够组成J元的物品,则返回-1,更改了返回dp[amout](二)递推公式:dp[j]=min(dp[j],dp[j-coins[i]]+1)(三)初始化:dp[0]=0,解释为凑够0元的总件数为0,其他元素为最大值。(一)dp数值初始化:dp[j]凑够J元需要的件数。(四)遍历顺序:先物品后背包,完全背包前序遍历。
2024-08-11 22:20:57 207 1
原创 代码随想录算法训练营Day38||完全背包问题、leetcode 518. 零钱兑换 II 、 377. 组合总和 Ⅳ 、70. 爬楼梯 (进阶)
(二)递推公式:dp[j]+=dp[j-coins[i]]把数组中第一个元素所能组成的方法数一直加到最后一个元素所能组成的方法数。(二)递推公式:dp[j]+=dp[j-nums[i]]把数组中第一个元素所能组成的方法数一直加到最后一个元素所能组成的方法数。(一)dp数组含义:dp[j]为凑成总和为j,可以的方法数。(四)完全背包,正向遍历背包,组合问题选择先物品后背包。(一)dp数组含义:dp[j]为凑成j元可以的方法数。(四)完全背包,正向遍历背包,排列问题先背包后物品。(三)初始化:dp[0]=1。
2024-08-11 12:02:29 293 1
原创 代码随想录算法训练营Day36||Leetcode1049. 最后一块石头的重量 II 、 494. 目标和 、 474.一和零
正数集+负数集=sum,正数集-负数集=target,然后把负数集=正数集-target带入,得到正数集为(sum+target)/2;这题的思路一开始我想到了让相近质量的石头相碰,但是想不到题解的思路给他分成两队,并且能用转化成背包问题,用一个总质量一半的背包去收集能装的最大质量,剩下的就是另一部分。(二)递推公式:max(dp[i][j],dp[i-num0][j-num1]+1)(注意这里是物品数,不是0或1的个数,所以是+1)(一)dp[i][j]:装满i个0,j个1的背包需要多少个字符串。
2024-08-10 20:50:07 232
原创 代码随想录算法训练营Day35||01背包
第一行要从j=weight[0]时开始,第一行第j列以后全都赋值成value[0],其含义是在等于weight[0]之前,背包放不下,默认价值为0,等到可以放下以后,(同时第一行的意思是只放第0件物品)后面全都赋值为第0件物品的价值。因为本题的遍历j是从0开始遍历,临界点是j为第i件物品的质量,所以能装下的情况可能是要把之前装的所有的物品都拿出去,再放第i件,因此第i件单件的价值可能不如之前小件加起来都和。注意这里的m是物品的种类数,而i是第i件,前者从1开始计数,后者从0开始计数,这里的开闭要注意。
2024-08-08 10:12:35 468
原创 代码随想录算法训练营Day32||Leetcode 62.不同路径 、 63. 不同路径 II
(2)递推公式:dp[i]=(i-j)*j 和dp[i-j]*j(取二者最大值) 前者是拆成两个数的情况,后者是拆成多个数的情况。(2)递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1](3)dp数组初始化:dp[0]=0,dp[1]=0,dp[2]=1。(5)返回第(m,n)个点的方法数,即第[m-1][n-1]个坐标。(5)返回第(m.n)个点的方法数,即第[m-1][n-1]个坐标。(1)dp数组含义:到达坐标为[i][j]点的方法有多少种。(4)遍历顺序:由上到下,由左到右。
2024-08-05 12:31:32 383 1
原创 代码随想录算法训练营Day32||动态规划章节:Leetcode 509. 斐波那契数、70. 爬楼梯 、746. 使用最小花费爬楼梯
(2)dp[i]=dp[i-2]+dp[i-1],因为到第n阶可以看做是第n-1阶花一步到第n阶,也可以看做是第n-2阶花两步到第n阶,也就是说,到第n-1阶和到第n-2阶共有多少种方法,到第n阶就有多少种方法,第n-2阶也可以先花一步到第n-1阶,但是不需要计算这部分,因为在计算n-1的方法时已经算过了。(2)递推公式:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])意思是,可以从i-1阶到顶部,也可以从i-2阶到顶部,取其中花费最小的一步。
2024-08-04 16:48:32 277 1
原创 代码随想录算法训练营Day32||Leetcode56. 合并区间、 738.单调递增的数字、
先排序然后从第二组数据遍历数组,让后者的左边界为前二的最小值,右边界为前二的最大值,最后遇到不重叠返回前一组数据。最后把数组最后一个元素返回即可。题解这个写法确实有点新颖,先是记录前面大于后面的元素(直接赋值为i做标记),准备赋成9,赋成9相当于借了前面一位,前面需要--后再与前前比较。然后想着后面的数字如果大于前面,就让前面-1,后面赋成9,结果遇到相等的0就翻车了。一开始确实想用暴力,然后懒得写了看题解,结果题解说超时还好没写。
2024-08-02 16:43:55 242
原创 代码随想录算法训练营Day30||Leetcode452. 用最少数量的箭引爆气球、 435. 无重叠区间 、763.划分字母区间
第二是对如何判断可以用一支箭引爆多个气球:首先如果第i+1个气球的左边界在第i个气球的右边界以内,说明可以穿过,此时只需要让一支箭穿过。如果是看第i+2个气球的话,就要用它的左边界和i和i+1右边界的最小值进行比较,因为如果不在最小值的区间内,即使在较大的边界内,前面两个已经被同时引爆了,第i+2也就变成了一个新的单独的个体气球了,所以这里需要考虑最小值的更新。这题是上一题的反过来,上一题是遇到不重叠区间(不重叠气球)就++,这题是遇到重叠区间就++。相同点是都要更新最小边界。一、最少的箭引爆气球。
2024-08-01 16:30:36 273 2
原创 代码随想录算法训练营Day29||Leetcode 134. 加油站 、 135. 分发糖果 、860.柠檬水找零 、 406.根据身高重建队列
然后讨论成立能跑完的情况,作差值,对差值进行叠加遍历(rest的+=操作)如果从前面开始,已经出现了rest<0的情况,那么起始点一定不能选在前面,一定是从当前遍历到结果<0的点之后才能开始跑完,并且这种算法忽略了对环的考虑。然后排列好之后,把前面有几个比自己大对应的数量k作为新数组的下标插入操作也很让我佩服,直接插入既利用了数组的下标特性,又能保证后面的元素不断更新(如果插在同一个位置就是后来者占据这个位置,而后来者恰恰是我们排序后较小的元素,即使原来这个位置元素被顶替,也不会影响结果)
2024-08-01 11:43:05 299
原创 代码随想录算法训练营Day28|| Leetcode122.买卖股票的最佳时机II 、 55. 跳跃游戏 、 45.跳跃游戏II 、 1005.K次取反后最大化的数组和
第一遍做的时候没有读清题意,以为跳到哪,就必须按照对应的下标的步数跳,所以会漏掉很多用例。然后添加了步数区间中搜索最大可跳步数的操作后,通过用例仍然有少部分不通过的。一开始想着用暴力,一个for循环遍历数组,然后再用一个for循环找到后面比他大的值,存放在最大值里,这样不仅漏情况,又超时。一开始依然是用找最大值的方法做的,这样只是能够找到每一步能跳到接下来跳最远的 地方,并不能找到最后的最优解。题解的思路很巧妙,把一段时间的最大利润拆成每天相加减的最大利润。cover的意思是覆盖范围的末边界。
2024-07-31 16:06:40 207
原创 代码随想录算法训练营Day27||Leetcode455.分发饼干 、376. 摆动序列、53. 最大子序和
思路很好想,和题解一致,但是一开始用while来写频繁报错,原因是while循环内要用if 和else if连接,不能用两个if连用,因为如果满足第一个if,那么会执行相应操作,执行完毕后,又带着改后的数据,再去判断第二个if是否成立,所以会报错。本题思路是,遍历数组,记录连续子数组的和,如果说连续子数组和为负值,说明这个连续的和对后面的值有负影响,所以直接删去,更新为新元素。不理解 很懵 为什么题干上说了前差不等于0,后差等于0不满足,而题解中前叉等于0,后叉不等于0就满足了。
2024-07-30 16:08:53 292
原创 代码随想录算法训练营Day25||Leetcode491.递增子序列 、Leetcode46.全排列、Leetcode47.全排列 II 、Leetcode52.N皇后
的)就跳出本次循环。hash数组是用于记录同一层、同一深度上的重复元素的(横着看不重复)这里回溯不用让hash数组元素归零,原因是每个hash数组的作用域在每一层,每次递归进行向深层遍历到时候,都会定义一个新的hash数组,而我们用的hash就是需要记录本层的,不需要回退清零(有点难理解)这题和之前的区别是,不能先排序,也就不能用之前nums[i]和nums[i-1]来判断是否可以重复使用了。并且这里的used数组既要存放深度重复值也要存放广度的重复值,因此要作为参数传入函数,并且不要漏了&符号。
2024-07-29 15:56:22 273
原创 代码随想录算法训练营Day24||Leetcode93.复原IP地址 、Leetcode78.子集、 Leetcode90.子集II
这题切割的方式有点新颖, 不像之前用startindex下标直接切割,而是定义了一个变量来存放’.'判断终止的条件也比较新,点的数量为3的时候,并且剩下的部分判断是否合法,二者同时满足时递归停止,录入结果数组。这题加深了我对剪枝操作的理解,used数组在纵向上表现为用过了就赋值为1,横向上表现为没用过默认为0,所以剪枝的条件是used[i-1]==0。有点蒙蒙的这里,result.push_back()操作提前这一步也让我很难自己想到,后边的每一个集合让我自己找的话有点困难。
2024-07-27 09:29:28 255
原创 代码随想录算法训练营Day23||Leetcode39.组合总和、Leetcode40.组合总和Ⅱ、Leetcode131.切割回文串
这题一开始没用startindex做,直接回溯穷举,导致最后类似【3,3,2】和【3,2,3】没有去重,用了startindex以后,就不会出现后面的数小于前面的数,只能是大于等于的情况,而大于这种情况本题允许取,所以可以是大于等于,且要注意,回溯函数的index要传入i,即当前遍历到的点的下标。1.传入的不需要是已经切割好了的字符串,可以是传入待切割的字符串的首尾位置,在判断函数内部切割。加了一道隔板/切割线,因此只有在下标索引到s.size()的前面,即最后一个元素的后面时,停止递归开始回溯。
2024-07-26 11:51:23 396
原创 代码随想录算法训练营Day22||回溯算法
回溯三部曲第一步,确定参数(返回值通常为void):n,k,startindex(用于回溯的起点),第二步确定终止条件(让数组长度等于k时,返回数组)第三步:单次搜索:用for循环来从startindex开始遍历到题目给的n,每次加一个元素进去给数组,然后开始回溯加下一个数。3.要注意终止条件的判断条件,一开始写成了if size==k,sum==k push+return else直接return忽略了还没有满,添加元素的过程,导致永远填不满就return了。三、电话号码字母组合。
2024-07-25 15:12:42 333
原创 代码随想录算法训练营Day21||Leecode669. 修剪二叉搜索树 、 108.将有序数组转换为二叉搜索树 、 538.把二叉搜索树转换为累加树
难点在控制单次循环的条件,本题的控制单次循环条件是:遍历节点,如果遇到了不在区间内的点,直接返回新子树。对于新子树,再对它的左右指针进行重新赋值为函数返回值,这就相当于对子树当成新的根节点,当成新树,进行了再修剪操作了。参照之前切割数组的思路做的,一开始right数组左侧没有+1,也就没有把已经录入根节点的元素去掉,导致出错,改成加一以后就通过了。思路挺好理解的,但是想不到用一个pre来记录上节点的值,对中序遍历的理解没有那么强,这题加强了对中序遍历的理解。
2024-07-24 15:28:10 248
原创 代码随想录算法训练营Day20||Leecode235.二叉搜索树最近公共祖先、Leecode701.二叉搜索树中的插入操作、Leecode450.删除二叉搜索树中的节点
我自己第一遍的写法是根据大小关系来遍历左右子树,然后遍历到叶子节点再插入。3.父节点,俩儿子,左儿子是小儿子,右儿子是大儿子(二叉搜索树的性质)把小儿子交给大儿子 ,然后再把大儿子交给爷爷,然后删除。这题依旧是用left来接受左子树返回上来的有效节点地址,无效(遍历到叶子后也没找到p/q)则返回空。二叉搜索树独特的性质可以让我在开始就可以通过比较根节点和目标pq节点值的大小来确定遍历方向。所以在此基础上,把插入节点的操作改成终止条件。2.父节点,但只有一个儿子,把儿子继承给爷爷,直接删。
2024-07-23 15:19:46 265
原创 代码随想录算法训练营Day18||Leecode530.二叉搜索树的最小绝对差、Leecode236.二叉树最近公共祖先、Leecode501.二叉搜索树众数
控制单轮循环条件运用了双指针,在cur没有遍历到最底层的叶子节点的时候,先不给pre赋值,然后等到到了最底层开始给pre赋值为cur,达成pre和cur始终保持着相差一个节点的距离的效果。在完成对count的操作之后,再维护maxcount,maxcount的含义是如果节点的节点数达到了maxcount,此时才为众数。这里返回值类型用的是void,不用int是因为定义了一个全局变量,用来随时更改保存最小的部分,这个思路我觉得可以沿用到想要返回一个需要不断比较和更新的类型。一、二叉搜索树的最小绝对差。
2024-07-22 16:39:12 212
原创 代码随想录算法训练营Day17||Leecode654.最大二叉树、
问题出现在,只要不是左右指针都为空,就new一个新节点,这样导致,不在中间返回的话,就会出现空指针异常,如果在中间返回的话, 就只能返回new的新节点,不能再往下检索了。没有考虑到本题是中序遍历,也没有想到这题定义一个最大值来实时比较大小的方法,值得二刷。因此需要题解中,若出现一个为空,则直接return 另一个节点的指针的做法。自己写的自己debug对了 ~~~太开心了。这题学到了什么情况会触发空指针异常的报错。
2024-07-20 18:07:37 223
原创 代码随想录算法训练营Day16||Leecode513.找树左下角的值、Leecode112.路径总和、Leecode106.中序后序构造二叉树
递归三部曲:第一步 返回值类型为空,参数需要传入每次开始的节点指针,和与已存最大深度比较的depth 第二步 确定终止条件为找到叶子节点,找到后需要变更最大深度,然后用result记录当前节点的值。经过我的思考和视频讲解,我认为,首先是因为maxdepth这个变量的存在,控制了同一层的节点之间比较,然后因为先遍历左侧,然后遍历右侧,这使得在同一层的情况下,先记录的节点值一定是左侧节点的值。第三步 单层循环逻辑为左遍历:每次减去左/右节点的数,然后判断其子树返回值是否为真,然后递归后回溯。
2024-07-18 16:41:42 236
原创 代码随想录算法训练营Day15||Leecode110.平衡二叉树、Leecode257.二叉树所有路径、Leecode404.左叶子总和、Leecode222.完全二叉树节点个数
第二步:终止条件是遍历到叶子节点(判断叶子节点的方法是看一个节点的左指针和右指针同时为空即为叶子)第三步:单层循环的代码是把节点值传入path数组中,在每一轮到遍历到叶子节点时,要用to_string函数把path中的int变量变成string类型存放进sPath这个变量中,这个变量把整条路径都保存下来以后再加入到result数组中。递归三部曲:第一步 确定返回值为int,参数是传入root,第二步 中止条件:分为几种情况:是左叶子节点、是右叶子节点,是左子树的左叶子节点,是右子树的左叶子节点。
2024-07-17 20:46:27 324
原创 代码随想录算法训练营Day14||Leecode226.翻转二叉树
swap的位置就是“中”的位置,inverval(cur->left)就是“左”的位置。因为swap是针对父节点的操作,所以可以吧swap的位置等效替换成“中”的位置。深度和高度一样都是采用后序遍历,在每一层节点中,先去探索左子树的最大深度,再探索右子树的最大深度,让二者比较取一个更大值+1(+1代表遍历过了一层)这里的特殊处理有点懵,也就是说,求最小深度是遇到了nullptr要给它特殊标记,左侧如果为空,右侧依然需要算。T.T第一次自己AC了二叉树这里的题,虽然不是用递归,用层序遍历做的。
2024-07-17 10:44:33 424
原创 代码随想录算法训练营Day13||二叉树
while的条件控制为队列不为空,也就是说,所有节点都访问完了,才回出现队列为空的情况,正是我想要的条件。3.二叉搜索树:特征是,所有左子树(包括左节点)小于根节点,所有右子树(包括右节点)大于根节点。维护就是说保护一个数据结构,让它本身的性质不发生变化,以单调队列为例子,维护单调队列就是让pop的时候只删去当前的队首(最大值),push之前把队内已有元素中小于即将加入的元素先去掉,然后再加入。2.完全二叉树:特征是除了最底层可以不满,其他层都是满节点,并且在底层的节点必须是连续的。
2024-07-15 22:33:23 1453
原创 代码随想录算法训练营Day11||Leecode150.逆波兰表达式求值、
这里的pop和push与标准队列不同,这里的pop的原则是:在队列不为空的情况下,传入值和已经放在队首的最大值元素相等时才弹出首元素。Push的原则是,在队列不为空的情况下,先把队内已有的,小于传入值的元素从队尾弹出,然后再从队尾插入传入值。逆波兰表达式在学习数据结构的时候看过实现过程,所以这题思路比较简单,同题解一致。本题的思路是,先把滑动窗口长度k内包含的第一组元素处理好,放入队列,然后再依次处理后续元素,让每次遍历新元素都能保证窗口k长度内最大元素在队首,并且存入result数组中。
2024-07-14 22:27:33 508
原创 代码随想录算法训练营Day10||Leecode232.用栈实现队列、Leecode225用队列实现栈、Leecode20有效的括号、Leecode1047删除字符串所有重复项
这样的问题是,如果队列中有重复的元素像用例中[1,2,2,3,4,2],temp=2,而到第二个元素就停止删除了,所以会出现错误。本题录入的方法是,如果检测到左括号,那么压入右括号,等到左括号全部检索完毕后,根据检索到的右括号和已压入的右括号进行一一比对。本题第一次尝试是开辟了三个栈,分别存放()、{}、【】,然后判断他们的大小是不是偶数来判断是否不是正确的括号,但是这个样只能判断括号数是否正确,如果存在({)}这样的次序问题就会出错。栈是单开口,队列双开口,想用栈实现队列,必须要用两个栈来才能实现。
2024-07-12 15:32:51 542
原创 代码随想录算法训练营Day09||Leecode151.反转字符串中单词、卡码网55.右旋转字符串
具体操作是,用慢指针检索尾部是否有空格(这里的空格一定只有一个,不会存在多个,因为第二步覆盖操作时已经利用continue去掉了连续的空格),如果有空格,就把字符串利用resize重新定义长度。这里有一个细节是,low指针在前面覆盖操作的时候,最后有一步low++的自增了,所以在下表中,指向的是末尾元素的后一位,因此检查最后一位是不是空格的指针是low-1指针而不是low指针。这道题涉及的知识点真的非常多,也非常有意思。第一,需要去掉多余的空格(包括开头的空格、后尾的空格、以及中间多余的空格)。
2024-07-11 19:42:18 349
原创 代码随想录算法训练营Day08||Leecode.反转字符串、Leecode541.反转字符串Ⅱ、卡码网54.替换数组
需要注意的是迭代器的使用,如果想用一个数组的头迭代器和尾迭代器还好说,直接用.begin()和.end()就行,如果想用中间某个元素的迭代器的话,就让.begin()+i。本题需要的知识点是,对现有字符数组进行扩充,用到了resize()函数,内部要求写原数组的大小加上要增加的大小。本题的思路是通过操作for循环的条件,一段一段检索字符串。每次以2k为单位长度来进行相应操作。没有很好的办法直接插入number单词,只能一个个往数组里添加。我用了双指针,首尾两个元素交换,题解用了swap()更简介。
2024-07-10 11:08:49 408
原创 代码随想录算法训练营Day07||Leecode.454四数相加、Leecode.383赎金信、Leecode.15三数之和、Leecode.18四数之和
3.在确定下标元素以后,双指针查值的时候,也要考虑去重的操作。简单的数组哈希表,我的实现思路是,把magezine这个字符串先存起来,表示可用的字母数量,然后遍历ranstomNote数组,对哈希表内的次数进行递减,最后检查哈希数组,如果出现负数,就代表着有不够用的字母,返回false,否则就返回true。今天运用的map操作和昨天相比,今天采用了umap[a+b]++直接对相同key值进行value自增,相当于一个计数器,而昨天是用map来作为一个存储工具,用的是.insert({})添加键值对的方法。
2024-07-09 21:59:29 1652
原创 代码随想录算法训练营Day06||哈希表、Leecode242.有效字母异位词、 Leecode349. 两个数组的交集 、Leecode202. 快乐数 、Leecode1. 两数之和
本题的实现思路是,先将nums1数组放到一个unoderder_set中先做个去重的操作,然后用一个类似foreach的循环,找到nums2中存在数字的迭代器,并把它加到结果集合中,最后根据题目定义的vector类型,把set类型用迭代器重新赋值成vector返回。我没有找到的关键点是,只要他不唯一,就会一直循环,一直循环就会出现重复值,出现重复值就可以用哈希表。因此,这个题要先找到,一个数的各位的平方和是多少,编写一个getsum的函数,用于计算每个数字的平方和,并且用于elem元素的更新。
2024-07-08 20:36:43 663 1
原创 代码随想录算法训练营Day04||Leecode24.两两交换链表节点、LLeecode19.删除倒数第N个节点、Leecode.面试02.07链表相交、Leecode142.环形链表||
本题设置了虚拟头结点,如果把两个节点看成一组的话,就把cur的位置放在这一组的前面,例如0号 1号节点为一组,那么这组的前面就是虚拟头结点,cur初始位置_dummyhead,更替后,23号为一组,那么cur变成1号节点即cur=cur->next->next。对于这个题,我起初有点懵,不知道相交的概念是什么,后来想到了是二者开始存在指针相同的节点就是要返回的节点。在有环的基础上,已知快慢指针的重合点是相遇点,根据画图已知:此时令一个新的指针从起点出发,让二者相遇即是环的入口。
2024-07-07 22:55:03 1031
原创 代码随想录算法训练营Day03||链表基础Leecode203.移除链表元素、Leecode707.设计链表、Leecode206.反转链表
让cur始终保持在pre的前一位,这样让cur的next指针指向pre就可以了实现了。因为cur的初始化必须是头结点,所以想让pre在cur的前一位就需要给pre赋值为nullptr,同时为了防止cur next赋值为pre后,丢失下一个节点的地址,要引入temp来保存curnext(下一个节点)的地址。1.链表的特征是定义一个结构体,每个结构体称作一个节点。对比数组,链表的插入只需要让前一个节点的next指针指向新节点,时间复杂度为O(1),查询元素需要从头结点开始依次遍历,因此时间复杂度为O(n)。
2024-07-06 16:39:52 671
原创 代码随想录Day02||Leecode977.有序数组的平方、Leecode209最小长度的子数组、Leecode59螺旋矩阵
3.当条件满足时,开始移动起始指针(缩小空间),移动的前提依然是题中所需要判断的条件,这里移动起始指针的时候,要用while来做一个持续移动的动作,而不是用if来只挪动一步。(本题的变量:length(当前满足条件数组的长度)、result(返回值)、sum(判断条件的元素)、i(起始指针))代码随想录中的判断条件直接采用了平方比较大小的方式,我采用的是用函数abs()取绝对值比较。1.想要求一个最短的长度,那么就定义一个result为最大值,反之,求最长的长度,就定义一个最小值。目前我遇到的最难的题型。
2024-07-05 22:17:54 769
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人