自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第四十五天|70. 爬楼梯(进阶) 322. 零钱兑换 279.完全平方数 139.单词拆分

下一次,i遍历到8的时候,j 再对字符串从0开始遍历,遍历到 j = 4的时候,判断s.substring(4,8) --"code" 在集合中是存在的,并且dp[4]是为true的,所以此时下标8位置上就可以设置成true,代表 code是存在在集合中的。从递归公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递归的根基,dp[0]一定要为true,否则递归下去后面都都是false了。递归公式一般是:dp[ j ] += dp[ j - weight[ i ] ]

2024-02-29 09:42:44 841

原创 代码随想录算法训练营第四十四天 | 完全背包理论基础 518. 零钱兑换II 377. 组合总和 Ⅳ

遍历方式和 纯的完全背包问题 一样,但是背包的遍历和物品的遍历不能替换顺序,因为纯完全背包理论求的是填满背包的最大物品重量,而这道题目求得是有多少种方法。正常的思路是使用回溯算法,但是这道题目使用回溯算法会超时,所以需要使用动态规划。这道题目使用动态规划就是在上面所说的 如果求排列数,就是外层for循环遍历背包,内层for循环遍历物品。如果求排列数,就是外层for循环遍历背包,内层for循环遍历物品。只需要改变遍历的顺序,先对背包进行遍历,再对物品进行遍历就可以。518. 零钱兑换||

2024-02-29 05:15:23 407

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

- 力扣(LeetCode)细节:这道题目是让数组中的石头两两相撞,如果重量相同,就可以消除掉, 如果数量不同,就剩下是大重量-小重量如果一直看的是将其中的每两个石头拿出来相撞,就陷进去了。从大局看,我们可以将这些石头分成两份,如果这两份重量相同,那最终是可以全部消掉的;如果这两份重量不相同,那最终就是大重量-小重量那怎么才能将石头分成两份呢,这就跟416. 分割等和子集比较相似了准备一个容量为 sum / 2 的背包,尽可能装石头,一份就是dp[sum/2];

2024-02-27 04:01:26 1005

原创 代码随想录算法训练营第四十一天|01背包理论基础 416. 分割等和子集

一维dp数组是根据二维dp数组中的先遍历物品再遍历背包推导来的,而且每次获取下一个物品对应的dp[i][j]时会根据前面的dp[i-1][j-weight[i]]获得,这个数组是在当前层的左上方,所以当是一维数组的时候,移动要从后向前进行遍历,前面的数在这一层更新中还要继续使用呢。一维dp数组是对二维dp数组情况的优化,因为dp[i][j] 是在dp[i - 1][j] 的基础上得到的,所以完全可以只维护一维dp数组,可以理解成是一个滚动数组,每遍历一个物品,一维dp数组全部更新一次。

2024-02-24 06:10:48 839

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

还有就是后面得到的这个数组还可以进行拆分,比如【9、8、7、6、5】,这里就可以借助dp[]数组前面的元素了【9的拆分、8的拆分、7的拆分、6的拆分、5的拆分】,其实就是dp[9]、dp[8]、dp[7]……动态规划的题目虽然说是要先确定dp数组的含义,再确定递归公式,但是总感觉这两者是相辅相成的,是一起出来的,但是到此,dp数组代表的都是我们要求取的值。总的来说 dp[i] = Math.max(dp[i] , j * (i - j) , j * dp[i - j]);

2024-02-24 05:13:10 946

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

对于初始化,应该初始化这个地图的上边和下边,这两边是没有办法通过递推公式获取到,那为什么要复制1呢,因为从start到达上方和下方的格子都只是只有一种情况,题目要求只能向上和向下,没有其他路径可以到达。因为格子的状态是二维的,所以每个格子的位置是【i,j】,那么dp[i][j]就代表,在从start到【i,j】位置上的路径为dp[i][j]初始化的时候,如果遇到障碍物,就不能向后初始化了,因为障碍是走不过去的,这是一个重要的细节,这一步错了,后面就完蛋了。爬格子的初始化是一条线,初始化上边和下边。

2024-02-22 09:40:35 1010

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

题目中要求的每次可以爬1或者2个台阶,也就是说,最终到达n阶台阶有两种方式,一个是爬1阶台阶到达(对应的是从n-1阶台阶开始),那么另一个就是爬2阶台阶到达(对应的是从n-2阶台阶开始爬),而爬n-1阶和n-2阶台阶的方法有dp[n - 1],dp[n - 2]个。至于要如何初始化dp[0] = 1还是dp[1] = 1 .我倒觉得这个不是大问题,只不过是在对代码的意义上的解释不同,dp[1] = 1更能体现出动态思路的意义,dp[0] = 1也没啥问题。第i个下标存储的是F(i)斐波那契的值。

2024-02-22 09:37:02 1012

原创 代码随想录算法训练营第三十七天|738.单调递增的数字 714. 买卖股票的最佳时机含手续费 968.监控二叉树

所以这道题目的局部最优是:遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]--,然后strNum[i]给为9,可以保证这两位变成最大单调递增整数。从后向前遍历,32是不满足情况的,改成29,为329,接下来,32是不满足情况的,改成29,最终是299,所以从后向前遍历,是可以不断利用上次比较出的结果的。从前向后遍历,33 是满足条件的,32是不满足条件的,改成29,最终是329,是不可以的,所以从前向后遍历会改变已经遍历过的结果了,就会造成不准确。

2024-02-22 09:00:44 335

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

1. 这道题目和 452.用最少数量的箭引爆气球 ,452中的弓箭数量其实就是 无重叠区间的数量,用总的区间数减去 无重叠区间的数量 就是我们要移除的元素数量。这个方法是根据左边界进行排序,记录弓箭的数量,其实就是在记录 无重叠区间的数量,那么总的区间的数量减去无重叠区间的数量就是要移除的区间的数量。如果本区间的左区间大于或者等于上一个区间的右边界,就说明是 无重叠的区间 ,此时需要更新最新的 无重叠右边界。如果本区间的左区间小于上一个区间的右边界,说明 区间重叠了,是要删除的区间,就进行记录。

2024-02-19 22:43:12 985

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

再次假设先对h进行排序(身高从大到小进行排序,身高相同的话则k小的站前面),此时确定了一个维度,就是身高,前面的节点一定都是比本节点高的。因为我一开始的逻辑会在[5, 5, 10, 10, 20],到最后一个顾客时,售货员手中只有两张10美元,没有5美元,这时也找不了钱,所以要针对。这就有一点混乱,类似于数学的区间问题,你定义的区间范围要合理,问题在于对于20美元找零的逻辑处理不够严密。排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]]

2024-02-17 11:01:02 1037

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

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。2、如果剩下的k是奇数,数组的最后一个数组就是最小的数字,直接翻转就可以。1. 首先我是从题目中的例子就反应过来,是不是可以把加油站加总和,油耗加总和,然后再相减?

2024-02-16 07:33:53 365

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

假设在第1天买入股票,在第4天买出股票所获得的利润更大,那么就是 prices[3] - prices[0] ,这个式子可以分解成(prices[3] - prices[2])+(prices[2] - prices[1])+(prices[1] - prices[0]),这样就把 全局利润最大 分解成 每两天的 利润最大。但是如果收集每一天的利润,那可能会包含负利润的情况,那对于这种情况只要不收集就可以,只收集获取利润的两天。遍历数组的时候,要获取当前下标数字可覆盖的最大范围。

2024-02-15 11:07:24 359

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

1. 用贪心算法做,这个做法真的有点神奇,我个人是想不出来这样直接用个count就接住,然后遍历完一遍数组。1.两种思路,注意判断细节,一个是最大遍历,所以是length - 1,一个是从0开始,注意数组的标号。,就是摆动序列的数量,其他不符合要求的并没有记录。对这里的条件还不是很理解。的时候进行记录(这就是判断的条件):满足峰值的,当一个值满足。:所有满足峰值情况的数字。

2024-02-15 09:55:02 409

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

2. 首先需要对数字和所代表的数字之间进行映射,可以使用map集合,也可以使用二维数组。这里因为有数字对应,所以使用二维数组比较方便。3. 具体的流程,先从digits中获取字符数字,转换成数组的下标,获取到对应的字母字符串,进行递归组合,再进行回溯。1. 这道题目的原理其实和组合的原理是一样的,都是可以抽象成树形结构的,只不过就是在数据类型的转换之间比较麻烦。1. 这道题目的原理其实和组合的原理是一样的,都是可以抽象成树形结构的,只不过就是在数据类型的转换之间比较麻烦。216.组合总和III。

2024-02-14 12:11:14 398

原创 代码随想录算法训练营第二十四天|回溯算法理论 77.组合

这道题的本质是对[1,n]中的数字进行 k 个数的穷举,就是要将所有满足条件的收集起来,此时就要想起来使用回溯算法,回溯算法的本质就是穷举。首先应该先到的就是双层循环,,很难写,因为求的是组合,根据参数的不同,组合也不相同,无法用循环的方式覆盖所有可能,单纯的循环是行不通的。每递归一层,集合中的元素就添加一次,所以集合中有的元素个数就是nums.size(),还需要的元素数目是 k - nums.size()其实回溯算法就是通过递归控制有多少层for循环,递归里得每一层就是一个for循环。

2024-02-14 12:06:08 455 1

原创 代码随想录算法训练营第二十三天|669.修剪二叉搜索树 108.将有序数组转换成二叉树搜索树 538.把二叉树转换成累加树

1.定义两个指针,从数组后面开始遍历,将cur指向的位置和pre指向的位置的数字相加,赋值给cur,然后两个值依次往前推进,就可以得到累加和。如果节点小于low了,那么节点的左子树都不能要了,直接返回删除干净的右子树就可以。如果节点大于high了,那么节点的右子树都不能要了,直接返回删除干净的左子树就可以。一开始想复杂了,怎么都写不出来,现在就是一看就会,一写就废。整体的思路就是,选取中间节点,构造左子树,构造右子树。1. 这道题的思考很有意思,想清楚怎么重新构造二叉树的,538.把二叉树转换成累加树。

2024-02-14 11:51:11 373 1

原创 代码随想录算法训练营第二十二天|235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

1. 这道题目比236.二叉树的最近公共祖先更有特殊性,所以使用一般二叉树的最近公共祖先的查找方法完全是可以的,然后就是利用二叉树的特性进行判断了。右子树都是比删除节点大的,所以在右子树中应该找一个比删除节点大最小的树,那就是左子树的最左侧的节点。假设让右子树继位,左子树一堆的数字应该继位到右子树的后面。删除的节点有一棵子树(节点左不空右为空,或者节点左为空右不空)删除的节点有两个子树(节点左不空,右也不空)删除的节点是叶子节点(节点左为空,右为空)情况1:没找到要删除的节点。情况2:找到了删除的节点。

2024-02-14 11:12:00 367 1

原创 代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

1. 遍历相同节点的元素的时候给节点元素记录出现频率+1,并且如果记录的值等于目前统计的最大频率的时候就记录,就将元素添加进结果集。如果记录的新的count值大于目前统计的最大频率maxCount了,那就说明之前记录的数字都是不合适的,全部删除了,重新记录。我们要寻找的是公共祖先,也就是我们要查找的这个祖先肯定是有自己的左节点和右节点的,所以是在中间节点上进行逻辑处理,所以采用的遍历方式是左右中。1).一个在公共祖先的左子树上,一个在公共祖先的右子树上。其实情况1就将所有的情况2的情况就包含了。

2024-01-30 22:16:23 322 1

原创 代码随想录算法训练营第二十天 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

1. 确定终止条件:题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。这表示一个数组大小是1的时候,构造了一个新的节点,并返回。数组中只有一个元素的情况。数组中没有元素的情况。确定用前序遍历,因为构造二叉树肯定是从根节点开始。第二步:选择出数组中的最大值,创建节点。第三步:递归左数组,递归右数组。

2024-01-30 21:11:49 363 1

原创 代码随想录算法训练营第十八天 | 513. 找树左下角的值 112. 路径总和 113.路径总和 106. 从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

那么前序(中左右)、后序(左右中)、中序(左中右),都是可以的,因为不论是那种顺序的遍历,每一层都是会先处理左边再处理右边,这道题目没有中间节点处理的逻辑。这道题目的整体思路是不难的,难的是代码的书写,比较容易转不去来,多写几遍,手动运行一下代码会更好理解。2、后序数组中的最后一个元素是根节点的元素,根据根节点元素创建二叉树。5、切割后序数组:利用左中序数组进行切割,得到左后序数组和右后序数组。3、切割点怎么找:遍历中序数组,找到根节点元素所在的下标位置。1、后序数组都是空了,就没有中了,就是空节点。

2024-01-29 23:01:23 402

原创 代码随想录算法训练营第十七天 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

暂时对回溯算法有了初步了解,回溯算法比较难理解的就是递归中的每次回溯,其实调用的递归函数还有自己的回溯,进去是啥,出了递归只是比进去的多了一个节点,所以除掉最后一个就可以了。2. 判断一棵树是不是平衡二叉树 不仅需要记录它的最大高度,还要判断子树是不是一棵平衡二叉树,如果不是平衡二叉树,它的最大高度就没有记录的必要了,但是需要对此做出标记。所以在处理节点的过程中,如果这个节点树是二平衡二叉树,我们就记录这棵树的最大高度,返回给上一层,如果不是平衡二叉树,那就给最大高度赋值-1,返回给上一层。

2024-01-29 09:40:37 793

原创 代码随想录算法训练营第十六天 | 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

根节点想知道自己的最大告诉的时候,让左右子树去统计,左右子树让分别让自己的左右子树去统计,以此类推。叶子节点下面的空节点返回来说自己是0,叶子节点加上自己的1返回给父节点,父节点再去比较自己左右节点的最大值。1. 这个后序遍历的方法其实和二叉树的最大深度的差不多,需要注意的就是,根节点左右子树的特殊情况,当根节点的其中一个子树为空的时候,要保证程序选择了非空子树的最小高度。3. 在计算当前N叉树的最大深度时,可以先递归计算出其每个子树的最大深度,然后再计算出当前N叉树的最大深度。求根的最大高度(递归法)

2024-01-25 21:41:16 367

原创 代码随想录算法训练营第十舞天 | 226.翻转二叉树 101.对称二叉树

【代码】代码随想录算法训练营第十舞天 | 226.翻转二叉树 101.对称二叉树。

2024-01-24 11:35:27 373 1

原创 代码随想录算法训练营第十四天 | 二叉树的理论基础

上图是对一个二叉树的代码模拟,画一遍更有感觉,其实循环中每次都是父节点被弹出添加,然后临走前将右节点和左节点添加进去,后面就按照左右的顺序出战。前序遍历时中左右,所以我们希望节点从栈中弹出来的时候也是中左右。1、确定递归函数的参数和返回值。3、确定单层递归的逻辑。144.二叉树的前序遍历(递归)145.二叉树的后序遍历(递归)144.二叉树的前序遍历(迭代)前、中、后序递归遍历(递归法)94.二叉树的中序遍历(递归)前、中、后序迭代遍历(迭代法)

2024-01-23 04:06:33 343 1

原创 代码随想录算法训练营第十三天 | 239. 滑动窗口最大值 、347.前 K 个高频元素

每次移动窗口,先poll(),再push(),保证了窗口中的元素。第三步:先将前k个元素放入窗口中,也就是指定了窗口的大小。第二步:创建存放结果的数组,创建窗口队列。第四步:遍历数组,获取窗口的最大值。第五步:返回最大值数组。第一步:自定义单调队列。

2024-01-22 05:45:23 344

原创 代码随想录算法训练营第十一天 | 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

如果因为压栈再弹栈和顺序会变化,所以最后要使用reverse(),如果不想反转可以从后往前遍历字符串i++) {if (!字符串作为栈字符串sb作为栈,从字符串s的头开始添加字符,sb的最后一个字符就是栈顶元素,每次添加的时候直接进行比较,如果不相等就添加,如果相等,就删除最后一个字符i++){top--;else{top++;

2024-01-22 04:51:33 369

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

2.思路是很清晰的,你queue要干什么,我stack就干什么,一个Input的stack往里放后,判断Output的stack是不是为空,空的话就all in装进去,然后进行相关的操作。为了让top和pop更加方便,避免这两个操作临近操作时出错,在添加的时候就将顺序排成栈的顺序。每入队一个元素,就将前面的元素出队再入队,这样保证了队头是栈顶元素。让q1中的元素进q2,实现了新进的元素都在队头(栈顶)第二步:实现push() --- 压栈。添加到队列中,如果队列有足够的空间,它将返回。,表示元素成功入队;

2024-01-19 06:37:01 394 1

原创 代码随想录算法训练营第七天 | ● 344.反转字符串● 541. 反转字符串II● 卡码网:54.替换数字● 151.翻转字符串里的单词● 卡码网:55.右旋转字符串

2.因为java中的String对象是不可改变的,不能进行原地修改和扩容,并不用转换成字符数组的,直接使用charAt()就可以。细节:弄一个空的,先放后面的,再放前面的,真的是相当有趣,竟然是简单的“大象从冰箱拿出来”1. Java语法 char[ ], toCharArray()1.temp是char类型。

2024-01-17 07:11:29 343

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

数值大小不可控,不可以用array;题意要统计元组出现的次数,所以我们需要有key-value的键值对, 所以说用Map。3.注意Java中String / char /int 语法。可以,但是要去重,选择双指针。1.哈希表的思维考虑,根据题意的大小。2.可以用数组或者map。2.不返回下标,那就排序。3.去重a(后一位对比)

2024-01-16 06:45:25 388 1

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

如下: 2 → 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4。此时,由于已经看到 4,该函数检测到一个循环并得出结论 2 不是一个快乐的循环数字。这是为了检测一个循环,该循环表明这。1.数据太大用数组不合适,那就用Set,Java中HashSet是Set的接口。某外卖厂一面时拷打过我,从简单处知道细节和想法,延展到三数/四数/n数和。,它将进入一个不包含 1 的数字循环,因此该函数最终将返回。,表明 2 不是一个快乐的数字。203.移除链表元素。不是一个快乐的数字。

2024-01-15 06:27:59 315 1

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

2.最后应该还是slow.n = slow.n.n,而不是slow = fast,因为当n = 1时fast可能跟slowx相邻。1.公式推导,知道当n = 1时,x = z,即在入口处head出发的slow 和fast相遇。1.画图解决,我的是跳 i < n个 而不是 i <= n,因此while 条件不一样。,意味着链表 B 比链表 A 长。为了简化代码逻辑,交换了。3.firstnode在哪?的引用,以及它们的长度计数。总是指向较长链表的头部,而。2.画图就可以理解怎么去反转。指向较短链表的头部。

2024-01-14 05:24:40 314 1

原创 代码随想录算法训练营第三天 | 203.移除链表元素,707.设计链表,206.反转链表

3.删除时找到第n个节点,找到是cur = cur.next,然后才是跨过去cur.next = cur.next.next。1.在进行插入第n时,在newnode.next = cur.next;3.节点交换顺序 cur.next = temp,最主要的是要让cur的下一个指向pre,这样完成一次反转。1. 删元素想到用dummy,dummy.next = head,不然就断了。1.需要把最后的null给弄出来,不然这样cur都走不到最后,反不过来。2.获取第n个时,设置cur操作head(会变)

2024-01-12 11:44:59 321

原创 代码随想录算法训练营第二天| 977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

细节:1.怎么去更新slow?2. result初始值是多少?3. 用while 还是 if 判断条件?细节: 1. 循环规则:左闭右开;2. 循环的逻辑很关键(i,j)是怎么走的?slow是在fast > target 之后进行的,然后再取result的最小值。首先画图,然后根据循环规则去找对应变量,然后进行循环画圈。细节:1.定义新数组语法;2.怎么样去让这个新数组出来。“一入循环深似海,从此offer是路人”

2024-01-11 05:03:53 353

原创 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

- 力扣(LeetCode)细节:两次查找//左闭右闭else{left = 0;

2024-01-11 00:31:46 320 1

空空如也

空空如也

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

TA关注的人

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