![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
代码随想录一刷
文章平均质量分 69
微风qin
努力!
展开
-
代码随想录算法训练营第五十三天| 1143.最长公共子序列 、1035.不相交的线、53. 最大子序和 动态规划
如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp(i - 1)[j - 1] + 1;1.dp数组:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp(i)[j]1.dp数组:dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]3.初始化:dp[0]应为nums[0]即dp[0] = nums[0]定义[0, i - 1]简化初始化逻辑。原创 2023-05-07 21:27:45 · 389 阅读 · 0 评论 -
代码随想录算法训练营第五十二天| 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
②遍历形式:本题要求连续递增子序列,所以就只要比较nums[i]与nums[i - 1],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。2.递推公式:当A[i - 1] 和B[j - 1]相等的时候,dp(i)[j] = dp(i - 1)[j - 1] + 1;举个例子A[0]如果和B[0]相同的话,dp(1)[1] = dp(0)[0] + 1,只有dp[0][0]初始为0,正好符合递推公式逐步累加起来。但dp(i)[0] 和dp(0)[j]要初始值,因为。原创 2023-05-05 21:38:14 · 371 阅读 · 0 评论 -
代码随想录算法训练营第五十一天| 309.最佳买卖股票时机含冷冻期 、714.买卖股票的最佳时机含手续费、总结
本题和前面几题状态相似,就是不持股的时候要减去手续费,返回值为持股和不持股的状态取最大值。总结:买卖股票问题,多增加状态就增加二维数组的状态数,用二维表达一维。和之前买卖股票问题解题思路相似,只是多增加了第二天的状态。至关重要,这是求dp数组的前提。原创 2023-05-04 23:50:32 · 49 阅读 · 0 评论 -
代码随想录算法训练营第五十天| 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV
3.初始化:记住同一天可以进行两次买入卖出即可解题,剩下按常理来推。①思路和上一题思路一致,只是变成了变量,参考上一题总结出普遍规律即可解此题。总结:买卖股票问题,多增加状态就增加二维数组的状态数,用二维表达一维。和之前买卖股票问题解题思路相似,只是多增加了第二天的状态。①没有操作 (其实我们也可以不设置这个状态) 4.遍历顺序:从前向后。,范围为2k或者2k-1都行,举例。至关重要,这是求dp数组的前提。1.确定dp数组以及下标的含义。一天一共就有五个状态,原创 2023-05-03 21:29:30 · 458 阅读 · 0 评论 -
代码随想录算法训练营第四十九天| 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
否则dp[i]表示买入,那还要定义第i天卖出,和剩下两种状态持有和不持有。原创 2023-05-02 20:02:55 · 881 阅读 · 0 评论 -
代码随想录算法训练营第四十八天| 198.打家劫舍、213.打家劫舍II、337.打家劫舍III
因为要取最大值,所以dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1])因为递推公式是dp[i-1]和dp[i-2],所以初始化要考虑dp[0]和dp[1]1.dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i] 只是考虑,不一定偷。,那么左右节点可以偷,也可以不偷,因此dp[0] = max([0],[1])(左右节点),因为要根据左右节点的偷的金钱状态,根节点判断当前根偷还是不偷。原创 2023-05-01 23:54:04 · 934 阅读 · 0 评论 -
代码随想录算法训练营第四十六天| 背包问题总结篇!、139.单词拆分
看下面两张图就能大致明白了。原创 2023-04-30 00:14:28 · 54 阅读 · 0 评论 -
代码随想录算法训练营第四十五天|70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数
本题爬楼梯就是把之前需要递推的思路:dp[i] = dp[i - 1] + dp[i - 2]由前面两种状态推导而来,改为。4.遍历顺序:本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。.那么只需要加上一个钱币coins[i],即dp[j -coins[i]] + 1;(dp[j - coins[i]] + 1, dp[j])比较的过程中。①首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0。1. dp[j]:凑足总额为j所需钱币的最少个数为dp[j]原创 2023-04-28 23:11:03 · 1085 阅读 · 0 评论 -
代码随想录算法训练营第四十四天|完全背包理论基础 、518. 零钱兑换 II 、377. 组合总和 Ⅳ
那么两个for循环的先后顺序就有很大区别了,而leetcode上的题目都是这种稍有变化的类型。不同于dp[j] = max(dp[j],dp[j - weight[i]] + value[i]),如果dp[0] = 0 的话,后面所有推导出来的值都是0了。,索引为i表示当前背包,因为dp[i]表示为装满重量为i的背包,能有几种组合。纯完全背包是凑成背包最大价值是多少,而本题是要求凑成总金额的物品组合个数。就是外层for循环遍历物品,内层for遍历背包。就是外层for遍历背包,内层for循环遍历物品。原创 2023-04-27 20:37:09 · 426 阅读 · 0 评论 -
代码随想录算法训练营第四十三天|1049. 最后一块石头的重量 II 、494. 目标和、474.一和零
代码随想录解题思路:本题是尽量凑成重量相同的两堆,然后进行碰撞//定义dp数组,dp数组是重量的背包 //dp[i]表示重量为i的背包能放下最大容量的石头 int [ ] dp = new int [ 1501 ];//sum[i]既表示重量也表示价值 int sum = 0;i ++) {//表示石头 for(int j = target;j --) {原创 2023-04-26 23:03:15 · 261 阅读 · 0 评论 -
代码随想录算法训练营第四十二天|01背包问题,你该了解这些!、01背包问题,你该了解这些! 滚动数组 、416. 分割等和子集
2.确定递推公式:不放物品i,放物品i dp[i]|[j] = max(dp[i - 1]|[j], dp[i - 1]|[j - weight[i]] + value[i]);1.dp[i]|[j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。每次放入一个物品之后,求得的dp数组就是能放下一个物品的容量的最大价值。1.dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]4.先遍历放入物品,再遍历不同容量的背包,从后向前遍历。,因此是0-1背包问题。原创 2023-04-25 19:41:48 · 420 阅读 · 0 评论 -
代码随想录算法训练营第四十一天|343. 整数拆分、96.不同的二叉搜索树
4.遍历顺序:首先一定是遍历节点数,从递归公式:dp[i] += dp[j - 1] * dp[i - j]可以看出,节点数为i的状态是依靠 i之前节点数的状态。2.确定递推公式dp[i] = Math.max(dp[i], Math.max((i - j) * j, dp[i - j] * j));4.dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历,先有dp[i - j]再有dp[i]1.dp[i] : 1到i为节点组成的二叉搜索树的个数为dp[i]然后最大乘积有两种来源,原创 2023-04-24 21:23:38 · 301 阅读 · 0 评论 -
代码随想录算法训练营第三十九天|62.不同路径、63. 不同路径 II
4.递推公式dp(i)(j) = dp(i-1)(j) + dp(i)(j - 1)都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。2.确定dp的表达式: dp(i)(j) = dp(i-1)(j) + dp(i)(j - 1);到达dp(i)(j)的路径个数为。4.从左到右一层一层遍历,这样保证推导dp(i)(j)的时候,dp(i - 1)(j) 和 dp(i)(j - 1)一定是有数值。1.dp(i)(j):表示从(0 ,0)出发,到(i, j) 有dp(i)(j)条不同的路径。原创 2023-04-23 15:56:30 · 329 阅读 · 0 评论 -
代码随想录算法训练营第三十八天|理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
动态规划中dp[j]是由dp[j-weight[i]]推导出来的,然后取max(dp[j], dp[j - weight[i]] + value[i])。但如果是贪心呢,每次拿物品选一个最大的或者最小的就完事了,和上一个状态没有关系。,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。确定dp数组(dp table)以及下标的含义。原创 2023-04-22 22:00:20 · 575 阅读 · 0 评论 -
代码随想录算法训练营第三十七天|738.单调递增的数字、day8 字符串的复习
(让数字最大),这样的操作一次for循环遍历,就可以判断判断出结果。做出nums[i - 1]–,nums[i] = 9。①暴力判断的方法时间复杂度为O(m * n),会超时。通过贪一部分值,达到高效的方法。②贪心:贪在只判断数字大小。原创 2023-04-20 20:46:03 · 348 阅读 · 0 评论 -
代码随想录算法训练营第三十六天|435. 无重叠区间、763.划分字母区间 、56. 合并区间
②从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点。此题判断重叠区间还是原先的思路,先排序,再根据右边界和左边界进行判断。①统计每一个字符最后出现的位置**(哈希结构存储)**不断求出重叠的最小右区间,模拟重叠过程就可解题。 如果遍历的 i == 最远下标, 用最远出现距离模拟了圈字符。 贪心可能体现在,找最远下标的情况。这几道题都是判断区间重叠,区别就是。这道题和射气球的题几乎思路一样。关键点在于判定重叠区间后,原创 2023-04-19 17:59:29 · 553 阅读 · 0 评论 -
代码随想录算法训练营第三十五天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球
①如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。贪心:局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。两个维度:1. 身高;2.前面有几个人比自己大于等于高。①先对数组进行排序,初始值置为1,因为最少有一次射箭。②判断边界是否重叠,如果重叠的话,那么跳过这次射箭,如果没有重叠的话,那么直接射箭次数加+1。②那么按照身高h来排序呢,,就是k和h都没确定下来。原创 2023-04-18 22:55:43 · 556 阅读 · 0 评论 -
代码随想录算法训练营第三十四天|1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果
①返回-1情况:如果总的加油量 < 耗油量 那么返回-1;其他情况肯定能能找到相应的位置。,例如比较每一个孩子的左边,然后再比较右边,如果两边一起考虑一定会顾此失彼。,因为从i之前开始一定不行。全局最优:找到可以跑一圈的起始位置。局部最优:只要右边评分比左边大,右边的孩子就多一个糖果。①先确定右边评分大于左边的情况(也就是从前向后遍历。是从右到左遍历,只比较左边孩子评分比右边大的情况。全局最优:相邻的孩子中,原创 2023-04-17 11:33:48 · 105 阅读 · 0 评论 -
代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II 、55. 跳跃游戏 、45.跳跃游戏II
看是否能到终点。理解cover为最大覆盖位置的下标,这样只需遍历每个元素,确定最大覆盖位置能不能到最后一个为止即可。原创 2023-04-15 20:45:02 · 450 阅读 · 0 评论 -
代码随想录算法训练营第三十一天| 理论基础 、455.分发饼干 、376. 摆动序列、53. 最大子序和
*贪心:**实际操作上,其实连删除的操作都不用做,因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了。当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。局部最优:只要当前子序列和值为正数,那么就会对下一个元素起到正的反馈,这个子序列会越积越大,也就继续可以用这个序列。本题设置一个preDiff和curDiff记录操作元素和前后元素的差值。**整体最优:**整个序列有最多的局部峰值,从而达到最长摆动序列。原创 2023-04-14 20:58:36 · 377 阅读 · 0 评论 -
代码随想录算法训练营第三十天| 332.重新安排行程、回溯总结
代码随想录回溯是递归的副产品,只要有递归就会有回溯整体题目:for循环遍历的时候什么时候加上startIndex?如果是一个集合来求组合的话,就需要startIndex,如求一个组合和的问题如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,如求多组电话号码和的问题。原创 2023-04-13 19:50:10 · 259 阅读 · 0 评论 -
代码随想录算法训练营第二十九天| 491.递增子序列、46.全排列、47.全排列 II
1.首先排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。 ③处理逻辑:1.要满足path的最后一个元素小于当前要收集的元素,否则continue。②参数:可以传入两个数组,分别用来记录树层之间的重复和树枝之间的重复(代码有点冗余) ②参数:就传入一个保证每次遍历不重复的startIndex即可。,如果当前树层有重复的元素,那么遍历到第二个重复的元素自动跳过不收集。①终止条件:当收集的元素个数等于nums数组的长度的时候收集。原创 2023-04-12 17:50:35 · 45 阅读 · 0 评论 -
代码随想录算法训练营第二十八天| 93.复原IP地址 、78.子集 、90.子集II
②终止条件:就是startIndex已经大于数组的长度了,就终止了,因为没有元素可取了。③单层逻辑: 每一次加上nums[i],表示本层选取的元素,再深入下一层取元素。那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!④收集元素:该树上的每个节点都要收集,因此每一层刚开始要收集本层元素。①要处理的字符串是不断修改的,难点在于修改的过程。,而不是和切割字符串一样完整的分割字符串。①参数:要传入要找子集的数组和。,与之前的组合问题不同,:涉及到三个方面的检查。难的在于字符串的处理。原创 2023-04-11 21:14:57 · 32 阅读 · 0 评论 -
代码随想录算法训练营第二十七天| 39. 组合总和、40.组合总和II、131.分割回文串
4.切割的子串长度为**[startIndex,i]**,因为i是这一层里面不断变化的值,startIndex是这一层的起始位置。1.本题递归函数参数还需要startIndex,因为切割过的地方,不能重复切割,和组合问题也是保持一致的。1.我把所有组合求出来,再用set或者map去重,这么做很容易超时!2.切割完之后,判断切割的结果是回文数之后,立即回收结果。分割回文串,思路和组合问题一样,就是实现形式不同。6.判断回收元素位置的最好办法是举个例子理解一下。这个给定数组与原先不同,这里面的元素有重复的。原创 2023-04-10 21:54:51 · 37 阅读 · 0 评论 -
代码随想录算法训练营第二十五天| 216.组合总和III 、 17.电话号码的字母组合
题增加了两处剪枝操作,一处是遍历范围,一处是判断sum结果大小是否大于target值。回溯参数要加上sum,记录添加元素后的值。一定要先手动模拟过程,再用代码去实现。回溯法都可以抽象成一个树形结构。思路同上一题的组合问题。原创 2023-04-08 21:51:31 · 79 阅读 · 0 评论 -
代码随想录算法训练营第二十四天| 回溯理论基础 、77. 组合
穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以。的操作,但也改不了回溯法就是穷举的本质。,backtracking(递归)就是。一定要先手动模拟过程,再用代码去实现。回溯法都可以抽象成一个树形结构。,这样就把这棵树全遍历完了。原创 2023-04-07 21:47:55 · 41 阅读 · 0 评论 -
代码随想录算法训练营第二十三天| 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
收获点:如果遇到不符合条件的值,大胆返回,因为。,那么当前节点一定能被正确的接住并返回。本题难点在于看懂题…原创 2023-04-06 21:45:56 · 35 阅读 · 0 评论 -
代码随想录算法训练营第二十二天| 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
的比较②从上向下去递归遍历,第一次遇到 cur节点是数值在[p, q]区间中,那么cur就是 p和q的最近公共祖先。二叉搜索树平均树高为O(n*log n),最差情况下退化为一个链表,为O(n),因此对应的时间复杂度也可以看出来。 ①如果p,q都大于根节点,那么说明最近公共祖先在根节点右边,递归右子树。 ②如果p,q都小于根节点,那么说明最近公共祖先在根节点左边,递归左子树。返回条件:因为最后要的是插入之后的二叉搜索树的根节点,所以直接返回每层根节点即可。处处理参数和返回值;原创 2023-04-05 20:03:27 · 28 阅读 · 0 评论 -
代码随想录算法训练营第二十一天| 二叉搜索树的最小绝对差 、 二叉搜索树中的众数 、二叉树的最近公共祖先
2. 在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。3. 要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。1. 求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。二叉搜索树中序遍历的结果,就是一个有序数组,这时再求两个节点的差就好求了。在遍历二叉树的过程中,就比较好了差值。原创 2023-04-04 22:09:01 · 53 阅读 · 0 评论 -
代码随想录算法训练营第二十天|654.最大二叉树 、 617.合并二叉树 、700.二叉搜索树中的搜索 、 98.验证二叉搜索树
②终止条件:如果root1 == null说明,root1左子树为空,返回root2(如果root2也为空,那就都为空)同理对于root2也是一样的思路。二叉搜索树大于根节点的值都在右边,小于根节点的值都在左边,所以给出一个数组就可以画出一棵符合条件的二叉树。②终止条件:当遍历到某一层,root为null 或者 root.val满足题目要求的时候,返回结果。①参数和返回值:参数为每层要处理的节点和要比对的值,返回值为当前找到的元素。构建二叉树的题目都是前序遍历,因为只有先建立起根节点,才能谈建立其他节点。原创 2023-04-03 23:18:11 · 31 阅读 · 0 评论 -
代码随想录算法训练营第十八天| 513.找树左下角的值、112. 路径总和 113.路径总和ii、106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)②终止条件:遍历到叶子结点结束,判断叶子结点是不是目标和,将结果存取到固定目标集中。③处理逻辑:如果不是叶子结点,就加上当前值,然后进入下一层递归;第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点。第五步:切割后序数组,切成后序左数组和后序右数组。第一步:如果数组大小为零的话,说明是空节点了。第六步:递归处理左区间和右区间。原创 2023-04-01 23:40:13 · 42 阅读 · 0 评论 -
代码随想录算法训练营第十七天| 110.平衡二叉树 、257. 二叉树的所有路径、404.左叶子之和
平时我们解二叉树的题目时,已经习惯了通过节点的左右孩子判断本节点的属性,而本题我们要通过节点的父节点判断本节点的属性。这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,④处理逻辑:如果本层不是叶子结点,那么就先递归左面的子树,找寻叶子结点,找到之后。这道题目要求左叶子之和,其实是比较绕的,因为不能判断本节点是不是左叶子节点。二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。本题又是一道求和的题,采取。原创 2023-03-31 21:40:16 · 38 阅读 · 0 评论 -
代码随想录算法训练营第十六天| 104.二叉树的最大深度、 111.二叉树的最小深度、 222.完全二叉树的节点个数
对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。②递归思路:如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,原创 2023-03-30 21:45:14 · 32 阅读 · 0 评论 -
代码随想录算法训练营第十五天| 层序遍历 、 226.翻转二叉树 、101. 对称二叉树
因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是。我们可以看出使用的遍历方式,左子树左右中,右子树右左中,所以我把这个遍历顺序也称之为“后序遍历”(尽管。,因为先左孩子交换孩子,再根交换孩子(做完后,右孩子已经变成了原来的左孩子),每次遍历从队列中取出的元素的时候,如果其左右节点存在的话都将其添加到队列中。此时左右节点不为空,且数值也不相同的情况我们也处理了。②处理逻辑:每次交换传入节点的左右节点,做到互换位置。节点为空的情况有:(原创 2023-03-29 21:14:25 · 46 阅读 · 0 评论 -
代码随想录算法训练营第十四天| 二叉树递归遍历、 迭代遍历
满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。完全二叉树:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点。为null,说明已经遍历到头,那么弹出一个节点作为当前节点,处理它,然后处理其右边。不为null,说明还没有遍历到头,压栈,然后继续访问这个节点的下一个节点。二叉搜索树:前面介绍的树,都没有数值的,而二叉搜索树是有数值的了,先遍历根节点,然后遍历左节点,然后遍历右节点,最后返回存出结。原创 2023-03-28 20:58:20 · 104 阅读 · 0 评论 -
代码随想录算法训练营第十三天| 239. 滑动窗口最大值 、 347.前 K 个高频元素
②用小顶堆(优先级队列底层实现数据结构)维护前k个出现频率较高的次数,遍历整个map集合,求出前k个频率entry,1.pop(value):如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作。//弹出的是一个一维数组,取数组头元素,头元素记录结点信息。2.push(value):如果push的元素value大于入口元素的数值,那么就。①暴力解法,遍历数组,然后每三个找出最大值,时间复杂度为O(n * k),直到push元素的数值小于等于队列入口元素的数值为止。原创 2023-03-27 21:48:09 · 28 阅读 · 0 评论 -
代码随想录算法训练营第十一天| 20. 有效的括号 、 1047. 删除字符串中的所有相邻重复项 、 150. 逆波兰表达式求值
栈原创 2023-03-25 17:29:59 · 43 阅读 · 0 评论 -
代码随想录算法训练营第十天| 232.用栈实现队列、 225. 用队列实现栈
如果Out栈不为Null时,说明Out栈中已经有了数据,此时先Pop out栈中的数据,因为Out栈就是用来输出的。,这样最后弹栈顺序一致;②本题压栈没有注意点。原创 2023-03-24 21:09:11 · 48 阅读 · 0 评论 -
代码随想录算法训练营第九天| 字符串和双指针法总结
移除元素—两个指针(快慢指针)在一次遍历下完成任务,其实降低时间复杂度的因素是避免了两个for循环中很多无用的操作双指针法可以将N数之和的时间复杂度降低到O(NN-1双指针说白了还是对数据相对位置的把控,同时对数据进行操作,节省了时间。原创 2023-03-23 21:25:44 · 85 阅读 · 0 评论 -
代码随想录算法训练营第八天| 344.反转字符串 、 541. 反转字符串II、 剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串
申请一个和原字符串同样大小空间的字符串,然后根据k,依次从k位置填到新的字符串数组中,最后将剩下元素填到字符串数组中。对一个要变化的字符串都要申请一个可变字符串对象。反转区间为n到末尾的子串。**解题思路二:**反转区间为前n的子串。原创 2023-03-22 22:15:16 · 51 阅读 · 0 评论