自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Day102 代码随想录打卡|动态规划篇--- 最后一块石头的重量II

方法:本题的背景说的比较复杂,但其实和昨天的分割子集问题很像,意思就是分割这样一个集合,使得最后分割得到的两个集合的总和差最小即可。这样就可以发现前面所有的步骤都可以套用昨天的问题,只是在最后得到最终的dp数组时,我们要如何得到这个最小可能的重量值。因为dp[target]表示容量为target的背包所能装载的最大重量的石头,我们把target定义为sum/2的值。这两个结果的差值就是最小能获得的重量。由于sum/2是向下取整,所以sum-dp[target]肯定是大于dp[target]的。

2024-09-28 19:42:35 274

原创 Day101 代码随想录打卡|动态规划篇--- 分割等和子集

方法:本题是一道01背包的应用题,需要将题目转化为01背包的形式。我们目标是找到能否将数组分割为两个总和相等的数组,即每个数组的总和为sum的一半,即判断一个容量为sum/2的背包,能否放下sum/2的重量的物品,如果可以的话就相当于可以分割;2:dp递推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])4:遍历顺序:一维滚动数组的遍历顺序是先遍历物品再遍历背包,且背包是倒序遍历。1:dp数组的含义:dp[j]表示容量为j的背包,可以放置的最大总和。

2024-09-27 20:32:40 300

原创 Day100 代码随想录打卡|动态规划篇--- 01背包问题(一维数组版)

但其实我们通过递推公式dp[i][j]=max(dp[i-1][j], dp[i][j-weight[i]] + value[j])可以发现我们可以简化问题。原因在于我们在计算dp[i][j]时使用的是从上一层推导而来的i-1,而我们如果在计算dp[i][j]时将上一层的值拷贝下来,在dp[j]进行计算,就可以将问题转化为一维数组的问题。同时递推公式可以变为dp[j] = max(dp[j], dp[j - weight[i]] + value[i]),也即去掉了一个维度。

2024-09-26 19:02:50 262

原创 Day99 代码随想录打卡|动态规划篇--- 01背包问题

当不放i物品时,当前的最大价值很容易得到就是有上一层状态得到为dp[i-1][j],如果当前放i物品的话,首先要预留足够放置i物品的空间,dp[i][j-weight[i]],,此时能获得的最大重量即使dp[i][j-weight[i]] + value[j],因此这两种情况下可以得到递推公式dp[i][j=max(dp[i-1][j], dp[i][j-weight[i]] + value[j])。方法:本题是经典的01背包问题,这种问题有固定的思考方式,先推导理解一下。

2024-09-18 20:20:17 168

原创 Day98 代码随想录打卡|动态规划篇--- 不同的二叉搜索树

当1为根节点时,数量为dp[0]*dp[2],当2为节点时,数量为dp[1]*dp[1],当3为节点时,数量为dp[2]*dp[0],因此我们可以归纳出递推公式为dp[i] += dp[j - 1] * dp[i - j](1<=i<=n,1<=j<=i)2:递推公式:dp[i] += dp[j - 1] * dp[i - j](1<=i<=n,1<=j<=i)方法:本题要通过前三个节点的情况画图找规律,找到递推公式。1:dp数组及含义:dp[i]代表i个节点组成的二叉搜索树有多少种不同的方式。

2024-09-14 18:59:51 174

原创 Day97 代码随想录打卡|动态规划篇--- 整数拆分

2:递推公式:想要获得dp[i]的最大乘积,需要一个j从1遍历,并计算j*(i-j)的值,这就相当于把i拆分为了两个整数的乘积,但具体拆分成几个是最大的我们并不知道。此时j已经从1开始遍历,肯定会取到所有的结果,因此我们只能拆分(i-j),去找寻(i-j)能拆分的最大乘积,而这个数字其实就是dp[i-j],因此我们的地推公式是dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]))4:遍历顺序:因为dp[i]依靠dp[i-j]的值,因此要从前往后遍历。

2024-09-13 17:21:35 341

原创 Day96 代码随想录打卡|动态规划篇--- 不同路径 II

本题与昨天的题的区别在于多了一个障碍物,存在障碍物的地方不能通过,因此到达障碍物的路径为0,直接将对应的dp数组设置为0即可,相当于在双层的for循环遍历中多增加一个条件。2:递推公式:到达地图中[i][j]的位置只能有两种方法,从[i-1][j]往下一步或[i][j-1]往右一步。因此dp[i][j] = dp[i - 1][j] + dp[i][j - 1]1:dp数组的含义:因为地图是一个二维结构因此dp数组是一个二维数组,dp[i][j]表示到[i][j]个位置有多少种不同的路径。

2024-09-12 21:16:04 340

原创 Day95 代码随想录打卡|动态规划篇--- 不同路径

2:递推公式:到达地图中[i][j]的位置只能有两种方法,从[i-1][j]往下一步或[i][j-1]往右一步。因此dp[i][j] = dp[i - 1][j] + dp[i][j - 1]1:dp数组的含义:因为地图是一个二维结构因此dp数组是一个二维数组,dp[i][j]表示到[i][j]个位置有多少种不同的路径。机器人每次只能向下或者向右移动一步。3:初始化:最上和最左边地图的边界的位置到达都是只有一种方式,因此被初始化为1。4:遍历顺序:因为只能向右和向下走,所以遍历顺序是从左到右从上到下。

2024-09-11 19:14:05 419

原创 Day94 代码随想录打卡|动态规划篇--- 使用最小花费爬楼梯

2:dp的递推公式:因为每次只能走一步或两步楼梯,因此dp[i]可由dp[i-1]走一步到dp[i]或者由dp[i-2]走两步到dp[i],因此dp[i]等于min(dp[i - 2] + cost[i - 2], dp[i - 1] + cost[i - 1])。3:dp数组初始化:因为第0层和第一层楼梯不需要耗费体力到达,因此dp[0]=dp[1]=0。5:举例推导dp数组:0 0 1 2 2 3 3 4 4 5 6。1:dp数组的定义:dp[i]表示到第i层楼梯所需的花费。方法:分析动态规划的五步。

2024-09-10 20:23:46 238

原创 Day93 代码随想录打卡|动态规划篇--- 爬楼梯

方法:本题是一个背景类的题目,需要我们从题目的背景中抽象出我们需要的内容,其实我们上楼梯的过程也是一个动态规划的过程,这一步的状态可以由你前一步或前两步的状态推导得到,因为一次只能走一步或两步。到第i层楼梯的话可以由i-1层楼梯走一步或者由i-2层楼梯走两步得到。因此第i层的方法是dp[i-1]+dp[i-2]。2:初始化:第0层楼梯不在我们的考虑范围。3:递推公式:分析得到:dp[i]=dp[i-1]+dp[i-2]1:dp数组含义:dp[i]代表到第i层楼梯可走的方法。

2024-09-09 11:14:54 252

原创 Day92 代码随想录打卡|动态规划篇---斐波那契数

本题是一道入门级别的简单题,因为题目中已经给了我们所有需要的信息并不需要我们自己去推导。按照计算前10个数的斐波那契值是0 1 1 2 3 5 8 13 21 34 55。因为第i个数的斐波那契值需要由i-1和i-2两个数得到,因此要从前向后遍历。F(n) = F(n - 1) + F(n - 2),其中 n > 1。递推公式就是dp(n) = dp(n - 1) + dp(n - 2)开始,后面的每一项数字都是前面两项数字的和。dp数组含义dp[i]就代表第i个数字的斐波那契值。表示)形成的序列称为。

2024-09-08 20:06:53 248

原创 Day91 代码随想录打卡|贪心算法篇---单调递增的数字

方法:返回小于等于当前数字的最大单调递增数字。我们需要考虑出现非递增的数字是什么情况,例如98就是非递增的数字,此时小于等于98的最大递增数字是89,具体变化是将个位数字变为最大的数字9,十位数字减一。抽象一下就是strnum[i-1]>strnum[i]时,将strnum[i]变为9,strnum[i-1]减一。然后考虑从前向后遍历还是从后向前遍历,因为我们是将前一位数字减一,后一位数字变为9.如果从前向后遍历的话可能出现遍历后的数字仍然大于前面的情况,因此我们需要从后向前遍历。的最大数字,且数字呈。

2024-09-02 20:53:47 366 1

原创 Day90 代码随想录打卡|贪心算法篇---合并区间

方法:本题和前面几题都有相似之处,首先要对无序的区间进行排序使其成为一群有序的区间以便更好的判断其是否重叠,现在按照左边界排序。随后第一个区间的左边界肯定是需要的,我们可以直接将其加入结果中,只对其右边界进行更新修改即可。随后从第二个区间开始判断其左边界与前一个区间的右边界的大小关系,如果前者小于等于后者说明区间有重叠关系,此时应该更新结果集中的右边界为新的右边界;一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。

2024-09-01 21:30:08 245

原创 Day89 代码随想录打卡|贪心算法篇---划分字母区间

方法:本题是按照特定要求划分区间的题目,要求为同一字母最多出现在一个片段中。思路是定义一个字符数组保存下每个字母最后出现的位置,在扫描一遍原数组如果遍历到一个位置时此前遍历过的所有字母最后出现位置都在前面且当前字母的最后出现位置与当前坐标位置一致的话就分割。持续遍历整个数组直到结束就得到了分割的长度数组。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是。返回一个表示每个字符串片段的长度的列表。

2024-08-31 16:36:16 200

原创 Day88 代码随想录打卡|贪心算法篇---无重叠区间

方法:互不重叠的区间,和之前的用箭射气球很像。因此方法也是一致的,先将区间进行排序,按照左或右排序都是可以的。这里我们按照右区间从小到大的顺序排序。首先我们定义第一个区间的右区间为边界,随后判断它和第二个的左边界是否有重合,如果没有,我们就将第二个的右边界定为边界,并定义count计数加一。但如果有重合的话我们取一二的最小右边界,判断它和第三个区间有无重合。以此类推到最后我们就找到了所有的不重合的区间的数量,用总区间数量减去不重合的区间数量就是要删除掉的总数量。需要移除区间的最小数量,使剩余区间互不重叠。

2024-08-28 15:41:38 228

原创 Day87 代码随想录打卡|贪心算法篇---用最少数量的箭引爆气球

方法:用最少的箭射完气球,只知道球在空间的X轴坐标,我们可以将这些球在空间中的左坐标进行一个从小到大的排序。判断相邻的气球是否可以用一只箭射穿,如果不可以就增加一只箭。如果可以的话更新一下这两个相邻气球的最小右边界,以便和下一个气球是否能用一只箭射穿作比较。重复遍历该排序后的数组直到全部处理完就得到了最少需要的箭数量。有一些球形气球贴在一堵用 XY 平面表示的墙面上。处射出一支箭,若有一个气球的直径的开始和结束坐标为。你不知道气球的确切 y 坐标。弓箭一旦被射出之后,可以无限地前进。可以射出的弓箭的数量。

2024-08-26 19:25:31 237

原创 Day86 代码随想录打卡|贪心算法篇---根据身高重建队列

方法:本体的说法很绕,去掉题目背景解释起来其实就是有一个二维数组,第二位的元素大小代表该数组中前面有几个大于等于第一个元素的数。因此是一个有两个元素的贪心问题,这种问题类似于分发饼干也是有两个元素,我们需要做的是先固定其中一个数字,而不能两个同时考虑,这样肯定会顾此失彼最后都考虑不到。因为第二位代表的是大于等于本元素的数目。因为第二维元素代表的是大于等于该元素的数量,且在一个元素插入时,前面已插入的元素都是大于它自身的,因此可以直接将它插入到第二个元素所指向的位置即可。是排在队列前面的人)。

2024-08-23 16:06:37 189

原创 Day85 代码随想录打卡|贪心算法篇---柠檬水找零

情况三:遇到20,这种情况稍微复杂,我们如果找零有两种方式,1:用一个10一个5找零。2:用3个5来找零。此时我们需要用到贪心策略,优先使用1的情况来找零,因为10只能找零20的,但5可以找零10和20,因此我们要多保留现有的5。方法:本题算是一道比较简单的题,只需要模拟就能获得结果,分析我们会遇到的情况其实一共只有三种,分别是收到5,10,20三种钱。情况二:遇到10,我们需要用5进行找零,如果此时5的数量大于0,我们可以就利用5找零,收下10。情况一:遇到5,我们直接收下即可,不需要进行找零。

2024-08-21 15:59:50 159

原创 Day84 代码随想录打卡|贪心算法篇---分发糖果

方法:本题需要对每个孩子分发糖果并确保满足给定的条件:评分搞得孩子比相邻的孩子的糖果多。第一种情况是从左到右比较右孩子与左孩子,所有孩子的糖果我们初始化为1个。如果右孩子的评分比左孩子高那么我们就给比左孩子多一个的糖果数,一直遍历到最后。因此我们要从后往前遍历,同时在这种情况时,如果左孩子大于右孩子,那么每个孩子分到的糖果就有可能有两种情况。一种是现在的结果(左孩子糖果数+1),因此我们要在这两个结果中取最大的,以保证这种情况下,该孩子的数量比左右孩子的糖果数都高。表示每个孩子的评分。

2024-08-19 18:49:51 253

原创 Day83 代码随想录打卡|贪心算法篇---加油站

方法:本题的思路不难,个人认为有些地方像之前一道股票的题,不过股票是要算最大利润为目标,我们是要把股票的利润拆分成售出价-买入价格,然后对利润进行求最大化。我们可以计算gas-cost是走完每段的剩油量,同时计算总剩余量curSum,和油箱最小剩油量min。如果curSum是小于0的,那么说明总油量不足以走完全程就直接返回-1作为情况1。如果min>=0,就代表油箱里一直是有油的可以走完全程。,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回。你从其中的一个加油站出发,开始时油箱为空。

2024-08-07 15:43:10 324

原创 Day82 代码随想录打卡|贪心算法篇---K次取反后最大化的数组和

方法:本题的思路其实比较好想,要想使得整体数组的和最大,一定是数组里的正数元素越多越好,因此我们要把所有k的机会优先用来将负数修改为正数,这里的修改顺序也是有讲究的,不能是随便选,我们k是有限的,想使得整体的总和最大要优先把绝对值大的数先修改为正数,这里就是局部贪心的一个思想。如果k为0了那就直接结束,此时就是最大的值了。但如果是负数我们需要进行一次修改。以这种方式修改数组后,返回数组。可以多次选择同一个下标。

2024-08-04 18:29:54 204

原创 Day81 代码随想录打卡|贪心算法篇---跳跃游戏 II

方法:本题和昨天的有相似之处但不完全一样,昨天的题目只要判断能否到达最后即可,而本题需要的是以最小的次数跳到最后位置,因此相比昨天的题目难度更大。但思路仍然是以最大覆盖范围做文章,我们遍历每个元素都能得到当前的最大覆盖范围,而当当前元素的最大覆盖范围到达不了最后位置时,我们就需要往下再走一步了,并再次计算下一步的最大覆盖范围,同时步数加1.一直重复这样的步骤,直到我们的步数可以到达最后位置就立即停止,当前的计数就是最小跳到最后位置的次数。题目(leecode T45):给定一个长度为。向前跳转的最大长度。

2024-08-01 19:16:15 360 1

原创 Day80 代码随想录打卡|贪心算法篇---跳跃游戏

本题重要的思路点是不要纠结每个位置上要跳几次,而是要想每个位置能跳到的覆盖范围。然后一直遍历每个位置所能到达的最大覆盖范围并判断该覆盖范围能否到达最后一个位置,如果可以的话就能成功。本题的贪心就体现在在每个位置找最大覆盖范围,局部最大范围推出整体最大范围。最大范围用cover表示,注意每个位置的最大范围不一定是当前位置值加上可跳范围。也可能是之前的最大范围。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回。给你一个非负整数数组。

2024-07-29 20:16:54 240

原创 Day79 代码随想录打卡|贪心算法篇---买卖股票的最佳时机 II

但我们需要想清楚一个事情,我们手里只允许有一只股票并且利润的产生是在两天产生的,即后一天和前一天的股票价格相比较才能计算出利润的大小,因此我们可以将利润分解为两天间的股票价格差。比如第一天买入第三天卖出所获得的利润其实就是第二天减去第一天的利润差和第三天减去第二天的利润差。知道了这点,我们就可以先计算出每天的利润,即当天减去前一天的股票价格,因此第一天肯定就是没有利润的了。本题中贪心的局部最优在于每天的利润只取正的,负的不要,最后每天都取正的。在每一天,你可以决定是否购买和/或出售股票。

2024-07-27 12:16:53 499

原创 Day78 代码随想录打卡|贪心算法篇---最大子序和

方法:本题的贪心思想有点难想,我们要想使子序列和是最大的,只需要维护一个result变量用来保存当前遍历数组得到的最大值,并用一个count来继续寻找更大的,count的逻辑是从头遍历数组求和,一旦遇到count小于0的情况,就立刻把当前count归0,因为count小于0再继续求和的话只会对后面的和起到拖累作用,不会是最大值,就立即放弃即可。因此本题贪心的重要点就是count小于0就扔掉,从下一个继续算。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

2024-07-26 16:31:16 251 1

原创 Day77 代码随想录打卡|贪心算法篇---摆动序列

方法:摆动序列是指一个序列中后一个与前一个数字的差是正负交替的,如果将一个数组的数字元素大小用波折的线来表示,那么就是一个上一个下的“波浪状”。因此在波动的转折点处计算是否有峰值的时候,遍历的下标 i ,计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果。对于prediff的更新,我们只需要在 这个坡度 摆动变化的时候,更新 prediff 就行,这样 prediff 在 单调区间有平坡的时候 就不会发生变化,造成我们的误判。

2024-07-25 18:25:09 406 1

原创 Day76 代码随想录打卡|贪心算法篇---分发饼干

本题中我们将孩子的胃口与饼干的大小排序,最大的饼干可以蛮大胃口大的孩子,也可以满足胃口小的孩子,但为了让能够满足的孩子的数量最多,我们将它分给了胃口大的孩子。因此我们可以遍历胃口数组,从后往前,每次将目前最大的饼干尝试分配给目前胃口最大的孩子,如果能够满足我们就分配,如果不能满足,我们就往胃口较小的孩子的方向遍历,再尝试分配。直到遍历到了最后一个孩子,这样我们在过程中每次都是将最大的饼干分配给能满足的胃口最大的孩子,因此这就是每一步的局部最优解,最后结束时我们获得的就是全局的最优解。,这个孩子会得到满足。

2024-07-24 16:38:17 168

原创 Day75 代码随想录打卡|回溯算法篇---解数独

不过不同于之前的问题等,解数独问题需要用到二位递归,昨天的N皇后问题相当于数独问题的简化版,因为我们只需要在每行放入一个皇后即可,而数独问题需要在每个位置上放置一个数字,因此我们需要用一个for循环来控制行另一个for循环用来控制列,依次寻找并判断每个位置放入每个数字的可能性。1:传入参数与返回值:传入board数独宫格,返回需要bool类型,因为我们需要收集的数据是在叶子节点上,而我们找到了解法后需要直接返回。3:单层处理逻辑:递归行递归列,判断每个位置每个数字能否放置即可。

2024-07-22 19:06:55 239

原创 Day74 代码随想录打卡|回溯算法篇---N皇后

方法:本题是回溯算法解决的经典问题之---N皇后问题,问题主要是解决皇后在棋盘中的约束问题,即皇后不能同行同列同斜线,这个约束可以通过一个简单的判断函数来辅助实现,主要是如何遍历N皇后的位置,是需要考虑的,其实N皇后问题也可以抽象成一个树形结构来实现,树中的每一行是对矩阵的每一行的遍历,每行中皇后有N个可能的位置,同时对这N个位置进行判断是否可行。3:单层处理逻辑:每一层中,我们需要对每行中的每一列做判断,判断该位置是否能放皇后Q,如果可以就将该位置设置为Q,不可以就跳过。的棋子放置方案,该方案中。

2024-07-21 19:17:40 171

原创 Day73 代码随想录打卡|回溯算法篇---重新安排行程

至于如何才能算找到了一条可用的线路,我们需要使用一个ticketNum的变量辅助,当我们result的结果集中的长度等于ticketNum+1时就相当于把所有的机票都用完也就是找到了一个符合条件的完整线路。1:传入参数与返回值:机票数量ticketNum和result结果集,由于我们在遍历过程中只需要找到一个符合条件的结果即可,因此我们返回值需要定义会bool,找到符合条件就立马返回true。3:单层递归逻辑:找到targets中同一个机场能飞的所有路线然后遍历回溯,记得修改targets中的值。

2024-07-19 19:48:21 339

原创 Day72 代码随想录打卡|回溯算法篇---全排列 II

方法:本题全排列与昨天的区别是本题会有重复的元素,但要求结果中不能有重复,即需要进行去重,而这里的去重我们在之前的题目中也接触过,即if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false)这里的逻辑如果 used[i - 1] == false即在同一树层上出现过,我们就需要跳过这种情况,因为会发生重复。其他的都和昨天的题目是一样的处理方法。给定一个可包含重复数字的序列。返回所有不重复的全排列。

2024-07-18 19:06:14 367

原创 Day71 代码随想录打卡|回溯算法篇---全排列

方法:全排列是数学中的基础问题,也是回溯算法能解决的经典问题。全排列因为每个元素都会用到,所以不需要startIndex来控制递归的位置,但由于每个元素只能使用一次而不重复,所以需要使用used数组来表示当前元素是否被使用过了,使用过的话就跳过当前递归。3:单层处理逻辑:单层中只需要判断一下当前的nums[i]是否是被使用过的,如果是的话就直接退出当前递归,否则的话就递归。2:终止条件:全排列要求每个元素都用到了,因此当path中收集的元素长度达到了nums.size时就可以收集结果并返回了。

2024-07-17 18:52:40 188

原创 Day70 代码随想录打卡|回溯算法篇---递增子序列

方法:本题要求找到无序数组的所有递增序列,和子集问题的思路有类似。同时本题中的去重的条件不能和之前的used数组方式一样,因为used数组中要求我们的nums数组是有序的,但这和我们本题的条件是冲突的,因此只能用unorderedset的方式来去重。3:单层处理条件:需要我们判断每个元素是否是重复的,如不重复再处理,然后就是基础的回溯。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。2:终止条件:无需终止条件,但需要path的长度大于1才能收集结果。

2024-07-16 20:02:54 246

原创 Day69 代码随想录打卡|回溯算法篇---子集II

和之前的使用方法是一致的,如果nums[i] = nums[i-1] && used[i - 1] == false就说明nums[i]和nums[i-1]是相同的并且nums[i - 1]已经使用过了,因此nums[i]就不用再计算了,否则就会发生同一树层上的元素的重复从而导致结果集中有重复,因此在遇到这种情况就直接跳过即可。3:单层处理逻辑:和子集问题一样就是最基础的递归加回溯方式,本题的重点在于去重,即多加了一个used数组的判断条件。,其中可能包含重复元素,请你返回该数组所有可能的。

2024-07-15 16:51:28 157

原创 Day68 代码随想录打卡|回溯算法篇---子集

方法:本题为求子集问题,采用回溯算法解决,与之前的组合与分割问题我们最后收集的是树上的叶子节点不同。子集问题我们需要收集的是树上的所有节点。且由于自己是无序的,所以我们不能重复选取元素,需要用到startIndex辅助下一次选取的元素的位置。2:终止条件:当能够选取的数组集合中的元素为空时就停止了,因为我们已经找到了能够选取的所有情况,即startIndex>=nums.size()时停止,但这句其实可以不加,因为我们for循环控制的startIndex本来就不会超过数组的长度。返回该数组所有可能的。

2024-07-14 20:23:18 496

原创 Day67 代码随想录打卡|回溯算法篇---复原IP地址

1:传入参数与返回值:传入包含数字的字符串s,以及切分的位置startIndex,因为我们不能重复切分,还需要一个记录已经加入的.的个数pointNum,因为IP地址需要我们加入三个.分成四段即可。方法:复原IP地址和昨天的分割字符串的思想是相同的,都是将一个字符串输入,然后找到所有切分的可能,本题再依次判断每一种切分中的字串是否符合IP地址的规则,即在0-255之间。如果不符合的话就直接返回代表把他剪枝掉了。,用以表示一个 IP 地址,返回所有可能的。正好由四个整数(每个整数位于。,这些地址可以通过在。

2024-07-13 21:01:50 454

原创 Day66 代码随想录打卡|回溯算法篇---分割回文串

方法:本题是一个分割回文串的问题,是回溯算法的另一类问题。针对一个字符串,我们要对其进行分割,并且确保分割后生成的子串也必须全都是回文串。2:终止条件:因为切割位置startIndex控制的是切割的起始位置,当startIndex大于等于s.size时,就意味着已经切到了最后,也就该停止了。循环中,我们 定义了起始位置startIndex,那么 [startIndex, i] 就是要截取的子串。1:传入参数与返回值:传入字符串s,以及切割的起始位置startIndex,不需要返回值。所有可能的分割方案。

2024-07-10 19:18:35 848

原创 Day65 代码随想录打卡|回溯算法篇---组合总和II

3:单层处理逻辑:本题有一个难点就是因为元素有重复所以最终的结果中我们要去重,有一种方法是算出所有的结果然后再利用set或map的结构去重,但这种方法容易超时,因此我们在计算结果的过程中就需要去重了。去重具体使用的时一个bool类型的used数组,他记录着候选数组中的每个元素的值是否使用过了。1:传入参数与返回值:与组合总和的套路相同,此题还需要加一个bool型数组used,用来记录同一树枝上的元素是否使用过。方法:本题的要求是每个元素在组合中只能出现一次,并且候选的数字是有可能重复的,因此需要去重操作。

2024-07-09 21:26:30 526

原创 Day64 代码随想录打卡|回溯算法篇---组合总和

方法:本题中的每个元素可以重复使用,且最终结果中的元素个数是未定的,只要满足和的条件即可,因此就决定了本题的深度是未定的,我们的终止条件就是path中的总和达到了targetsum值或者大于了targetsum值就终止了。这里需要注意的是因为我们的数字是可以重复选取使用的,因此,startindex的值不用每次都加一,可以重复使用当前的数字。1:传入参数与返回值:传入候选输入的数字candiates,还有目标值target,当前总和值sum,还有控制索引开始位置的startindex。,并以列表形式返回。

2024-07-04 21:12:21 558

原创 Day63 代码随想录打卡|回溯算法篇---电话号码的字母组合

方法:本题给定一个数字的序列,每个数字都在九宫格的键盘上对应3到4个不同的字母,然后将这几个字母组合起来看有多少种不同的输出结果。相同于给定的数字的序列的长度对应的是回溯树的深度。2:终止条件:因为每个数字只需要取出一个字母,所以最后取出的结果中的字母的个数是和输入的数字的个数是一致的,因此当s字符串的长度达到了输入的数字的个数时即可收集结果了。3:单层处理逻辑:在每一层中我们需要首先从字符串中取出将要处理的数字,然后找到该数字对应的字母,一次处理这些字母,将其加入s中。注意 1 不对应任何字母。

2024-07-03 17:40:52 387

空空如也

空空如也

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

TA关注的人

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