自定义博客皮肤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)
  • 收藏
  • 关注

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

【代码】代码随想录算法训练营第五十天|309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费。

2024-05-26 13:34:12 518

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

【代码】代码随想录算法训练营第四十九天|123.买卖股票的最佳时机III 188.买卖股票的最佳时机IV。

2024-05-25 15:14:37 312

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

若果第i天不持有股票,则1.第i-1天就不持有股票,则dp[i-1][1];2.第i天卖出股票,所得现金就是prices[i]+d[i-1][0]如果第i天买入股票,则今天所得现金就是dp[i-1][1]-prices[i]与上一题不同的是,dp[i][0],第i天买入股票的情况。dp[i][0]表示第i天持有股票所得最多的现金。

2024-05-23 16:12:07 321

原创 代码随想录算法训练营第四十七天|198.打家劫舍 213.打家劫舍II 337.打家劫舍III

如果不偷当前节点:取左右孩子偷或不偷的最大值,int val2=max(left[0],left[1])+max(right[0],right[1]);如果偷当前节点:左右孩子不偷,int val1=cur->val+left[0]+right[0]但是递推公式dp[i]=max(dp[i-2]+nums[i],dp[i-1]);如果数组只有一个元素,dp[i]=nums[0];偷i:dp[i]=dp[i-2]+nums[i]dp[i]:i以内的房屋,偷的金额最大值。不偷i:dp[i]=dp[i-1];

2024-05-22 18:27:44 824

原创 代码随想录算法训练营第四十六天| 139.单词拆分

if[i,j]出现在字典里&&dp[j]为true,那么dp[i]为true。dp[0]=true;dp[i]:字符串长度为i,dp[i]为true;外层背包(字符串),内层物品(字典)

2024-05-21 15:52:44 229

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

70. 爬楼梯 (进阶)解题方法1.dp数组及下标含义:dp[i]:爬i阶楼梯有dp[i]种方法2.递推公式:3.初始化dp[0]=1;dp[i]=0;i非04.确定遍历顺序外层背包,内层物品5.打印dp数组Code复杂度时间复杂度O(n*m),m:最多爬m个台阶,n总共有n阶台阶空间复杂度O(n)322. 零钱兑换解题方法1.dp数组及下标含义dp[i]:凑成总金额amount的最少的硬币个数2.确定递推公式:3.初始化:dp[0]=0;

2024-05-20 15:40:38 298

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

完全背包不限制物品个数,背包容量为j,求最大价值动规五部曲:1.dp数组及下标含义2.递推公式3.初始化4.确定遍历顺序:背包、物品的遍历顺序可以颠倒5.打印dp数组518. 零钱兑换 II解题方法1.dp数组及下标的含义:dp[j]:总金额为j的货币组合数为dp[j]2.确定递推公式:3.初始化:dp[0]=1;4.确定遍历顺序:组合数:外层物品内层背包排列数:外层背包内层物品5.打印dp数组Code复杂度。

2024-05-19 20:54:10 289

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

先遍历物品,再遍历背包,且内层for循环倒序遍历。1049. 最后一块石头的重量 II。dp[j]:背包容量为j,最大重量为dp[j]O(n*m),m为石头重量的一半,n为石头块数。dp[j]=0,避免把石头重量的最大值覆盖。5.距离推导dp数组。

2024-05-18 20:32:26 240

原创 代码随想录算法训练营第四十一天| 01背包问题 二维 01背包问题 一维 416. 分割等和子集

当j<weight[0],dp[0][j]=0;当j>=weight[0],dp[0][j]=value[0]dp[i][j]:表示从下标为0-i的物品里任意取,放进容量为j的背包,价值最大。dp[j]表示背包容量为j,最大价值为dp[j]dp[j]表示背包容量为j,最大价值为dp[j]廷尉题目要求“包含正整数”,将数组初始化为0。外层遍历物品,内层遍历背包,且内层是倒序遍历。外层遍历物品,内层遍历背包,且内层倒序遍历。若物品价值为负,dp数组初始化为负无穷。若物品价值>0,dp数组初始化为0。

2024-05-17 17:23:04 370

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

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

2024-05-16 16:24:58 509

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

1.确定dp[i][j]及下标的含义:dp[i][j]表示到达目的地的路径数,i表示行,j表示列。2.确定递推公式dp[i][j]=dp[i-1][j]+dp[i][j-1]dp[i][j]表示有dp[i][j]条不同路径。4.确定遍历顺序:从左往右遍历,从上往下遍历。4.确定遍历顺序:从上往下和从左向右遍历。3.dp数组初始化:当行或列不能遇到障碍。3.初始化:第一行和第一列。5.举例推导dp数组。5.举例推导dp数组。

2024-05-14 21:51:06 441

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

2.确定递推公式:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])1.确定dp[i]及下标含义:dp[i]表示爬楼梯的方法数,第i层楼梯。5.举例推导dp数组 n=5:1,2,3,5,8,dp[5]=8。2.确定递推公式dp[i]=dp[i-1]+dp[i-2];3.dp数组如何初始化 dp[1]=1;1.确定dp数组及下标含义:到达第i台阶所花费的体力是dp[i]dp[i]表示第i个数的斐波那契数值为dp[i]3.dp数组初始化:dp[0]=0;

2024-05-13 19:50:58 350

原创 代码随想录第三十六天738单调递增的数字

解题方法:从前往后遍历,可能需要反复改变str[i]的数值;从后往前遍历,就可以重复利用上次比较得出的结果。如果str[i]

2024-05-11 16:35:54 279

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

再遍历一遍数组,用right和left代表分段的右左区间端点,取right和字母最远的边界的最大值更新right,如果right==i,那就找到了分割点。如果i的左端点>i+1的右端点,把区间的左端点更新为i和i+1左端点的最大值。遍历数组,如果i的右区间大于i-1的左区间,就没有重叠,需要更新左区间。遍历数组,如果i的右区间大于i-1的左区间,就没有重叠,需要更新左区间。先用哈希表遍历一遍数组,同时记录每个字母出现的次数。找到出现过字母的最远边界,该点就是分割点。判断何时更新区间的右端点。

2024-05-10 17:58:41 679

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

第三种:bill=20,(优先考虑)若five>0&&ten>0,five--,ten--;若five>2,five-=3;三种情况,一种贪心,在bill为20时,有一次贪心选择:优先考虑先找10+5,再考虑找3*5,因为5可以用于bill=10和bill=20两种情况。bill=10,若five>0,five--,ten++;如果气球重叠了,更新i的右边界为i和i-1的右边界的最小值,如果没有,result++。先排身高,再排k,则从后往前插入时,就不需要再考虑身高,k值就插入到和数组下标相同的位置。

2024-05-09 15:46:53 379

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

就一直对nums最小的那个正数取反,如果k是奇数,就直接把最小的数取反,如果是偶数,就不动。就一直对nums最小的那个正数取反,如果k是奇数,就直接把最小的数取反,如果是偶数,就不动。如果数组的净增量之和小于0,则无法循环一圈,如果大于0,当cursum<0时,将i+1作为新的起始点。第一次:先把数组按绝对值排序,对小于0的取反,然后k--,直到遍历完数组。第一次:先把数组按绝对值排序,对小于0的取反,然后k--,直到遍历完数组。左孩子>右孩子,所以需要用到右孩子的情况,所以这种情况下,从后往前遍历。

2024-05-09 09:36:19 408

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

如果当前最大范围覆盖到数组最后了,就break;如果没有,result++,更新当前范围为下一步范围,更新完之后,如果范围覆盖到数组最后,就break。贪心:以最小的步数,覆盖最大的范围。因此,需要统计当前最大范围和下一步最大范围。可将最终结果拆分成每天的利润相加之和。局部最优,nums[i]的覆盖范围。整体最优,整体覆盖范围能否达到终点。局部最优:每天的正利润。整体最优:正利润之和。贪心贪的是:覆盖范围。如果没有:break。

2024-05-07 18:46:27 371

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

当连续和为负数时,会减小nums[i];把result初始值设为最小值,for循环,让count累加,如果count>result,就更新result值,如果count小于0,就把nums[i]做为起始位置。3.在for循环里,只记录prediff的峰值方向是否改变,不纠结值的大小是否改变。另外在for循环里,遍历饼干时,要用if,如果用while,若满足条件,则会一直循环。若先遍历饼干,饼干在for循环会一直做减减操作,导致饼干一直不满足胃口。2.假设最前面有一个和第一个元素相等的元素,假设有一个平坡。

2024-05-06 18:58:17 472

原创 代码随想录算法训练营第三十天| 51. N皇后

【代码】代码随想录算法训练营第二十七天| 51. N皇后。

2024-05-05 22:33:19 243

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

定义一个bool的used数组,来记录哪些元素已经取过了,避免重复取同一个元素。单层搜索逻辑:注意树层去重,同一父节点下的同层使用过的元素就不能再使用了。题目描述“包含重复数字”“不重复的全排列”,意思是要求去重。不需要设置startIndex来避免相等的元素重复取了。题目要求:“该数组中递增子序列”,所以不能排序。使用bool的used来避免取到值相同的元素。终止条件:当i>=nums.size()时。used来避免树层取到值相同的元素。参数:数组,遍历起始下标。

2024-05-04 15:53:44 382

原创 代码随想录算法训练营第二十八天| 93.复原IP地址 78.子集 90.子集II

单层递归逻辑:for循环:对树层去重:i>0,当nums[i]==nums[i-1]时,且used[i-1]==false;说明这个相等的值已经使用过了,跳转。单层递归逻辑:for循环遍历,注意i要从startIndex开始,否则会有重复。终止条件:当startIndex>=nums.size(),就return.参数:nums,startIndex,used。参数:nums,startIndex。抽象为树形结构,收集每个节点。和分割回文串类似,只是多加了。

2024-05-01 14:25:01 325

原创 代码随想录算法训练营第二十七天| 39. 组合总和 40.组合总和II 131.分割回文串

树层去重:定义一个bool型的数组,若第i个位置已经使用过标记为used[i]==true,若没有,used[i]==false;注意第三步可以做剪枝操作,当sum+candiadates[i]>target时,i已经没有必要向后遍历了,所以i遍历范围是i

2024-04-29 22:35:17 394

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

取数字的个数做为树的深度,每个数字包含的字母个数作为树的宽度。首先想到的是暴力解法,但明显对于k值稍微大些的情况,时间复杂度极高。单层搜索过程:横向遍历for循环,这里可以剪枝,缩小i的范围。递归函数参数:目标和,k值,当前和,遍历的起始位置。终止条件:叶子结点或者当前和已经大于目标和。数字和字母映射,使用map或定义一个二位数组。回溯函数参数:字符串型的数字,用来记录的变量。故采用回溯法,用递归代替for循环。树的深度代表k值,树的宽度代表集合。终止条件:inde等于数字的个数。

2024-04-28 17:46:26 335

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

首先想到两层for循环,但明显不适合n=100,k=50,这种k很大的情况。用递归代替for循环。把回溯法解决的问题抽象为树结构。横向是树的宽度,纵向是树的深度。递归函数的返回值n,k,startIndex,startIndex用来记录集合从哪里开始遍历,剪枝:可以在for循环时改变i的范围,因为当k值大于集合剩余的元素数量时,后面就没必要遍历了。单层搜索过程:for循环式横向遍历,递归的过程是纵向遍历。定义一个二维数组存放结果集,定义一个一维数组存放结果。终止条件:到达叶子结点,可以用path保存结果。

2024-04-27 16:06:53 263

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

首先想到中序遍历,让它变成有序数组,采用双指针法,然后再让这个数组后序遍历,从后往前加,所以采用右中左遍历。定义一个整型变量,存放当前节点的前一个节点的值,pre。先遍历右子树,再遍历左子树,我感觉本题有点像使用双指针的整数二分。明确定义的区间,本题是左闭右闭。递归函数的参数为数组,区间的左右值,返回值为根节点。如果定义节点类型,容易操作空指针。

2024-04-27 13:43:44 178

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

第五种情况:将要删除的节点的左子树的根节点连接到删除节点的右子树的最左侧的叶子结点,因为该叶子节点是最接近删除节点大小的。二叉搜索树是有序的,所以祖先一定在q和p之间,并且越靠近根节点,深度越大,所以根本不用遍历完,就可以找到最近公共祖先。若节点值<目标值,就向右遍历,用root->right接住,然后递归。若节点值>目标值,就向左遍历,用root->left接住,然后递归。第三种情况:删除节点后,直接返回节点的右子树。第四种情况:删除节点后,直接返回节点的左子树。3.节点左孩子为空,右不为空。

2024-04-25 17:53:50 351 1

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

定义两个指针,一个cur,一个pre,pre指向cur的前一个节点,还是中序遍历,遍历到中节点时,当pre不为空时,取result最小值,再遍历右节点。中序遍历找到有序的数组,但是有点浪费空间,所以改为双指针。遍历一遍,用map记录,但是太过复杂,采用双指针。

2024-04-24 21:24:20 139

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

首先遍历这个数组,找到数组的最大值作为根节点,然后定义两个新变量,取出最大值的数组下标和数值,返回数值,以最大值的左右两边构造左右二叉树,左右二叉树的根节点选取如上,需要注意的是,左右两边数组的大小要分别大于0和小于nums.size()-1,注意左右区间的定义,是左闭右开还是左闭右闭。以前序为例,递归函数参数为两个树的根节点,返回值为合并两个二叉树的节点之后的值。让新的树的左子树等于递归函数,新的右子树等于递归函数。>第二种(定义新的树):定义新的节点,让原本被操作的树的节点等于定义的新结点。

2024-04-23 20:42:29 314

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

首先要找到最后一行,再找左下角。如果是递归的方法,只要遍历顺序,左在右的前面即可。首先要找到最后一行,再找左下角。如果是递归的方法,只要遍历顺序,左在右的前面即可。

2024-04-21 16:23:56 319 1

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

以根节点举例,首先判断其是否为空,其是否有左右孩子,若为空,或者没有左右孩子,return 0;若不为空,有左孩子,判断左孩子是否为叶子结点,若为叶子结点,则leftvalue=root->left->val。采用前序遍历,中左右,当遍历到叶子结点的时候,就到了收获结果的时候,把路径加到sPath去,注意转化为string,然后popback节点,这就是回溯。首先,判断节点是否为空,然后后序遍历,计算最底层节点的高度,计算左右子树的高度差是否大于1,然后向上返回。从父节点出发,判断其左孩子是否是叶子结点。

2024-04-20 17:18:24 400

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

不同之处在于,最小深度的定义在于从根节点到最近叶子结点的最短路径上的节点数,因此需要在根节点存在的前提下判断,根节点的左右孩子是否存在,总共三种情况,1.左存在,右不存在。2.左不存在,右存在。因为二叉树节点高度的定义是节点到叶子结点的最长路径边的条数或节点数, 是从下往上数,所以采用后序遍历。而根节点的高度就是二叉树的最大深度。不同之处在于,题目求的是,节点个数,所以根节点的左右子树的节点个数直接加,最后再加一。和求二叉树的最大深度很类似,但又有细微不同。通过求二叉树的高度来求二叉树的最大深度。

2024-04-18 21:38:13 398

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

先交换左右孩子节点,再反转左子树,右子树。

2024-04-17 20:50:34 157

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

【代码】代码随想录算法训练营第十三天| 递归遍历。

2024-04-16 21:45:33 199 1

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

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

2024-04-16 19:52:51 284 1

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

先遍历字符串,将字符串放进模拟栈中,遍历时,看是否和栈顶元素相等,如果相等就弹出栈顶元素,然后接着遍历。在遍历字符串的时候,肯定是先遍历左括号,再遍历右括号,才能把括号消完。把字符串的括号对应的另一个括号放进栈中,当遇到和栈顶相同的元素后,把栈顶元素弹出,然后接着遍历字符串。先遍历这个表达式,遇到运算符号就把栈的前两个元素拿出来做运算,最后留在栈中的就是结果。1.遍历完字符串后,栈中还有元素。时间复杂度:O(n)空间复杂度:O(n)时间复杂度:O(n)时间复杂度:O(n)空间复杂度:O(n)

2024-04-13 15:48:07 264

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

push和empty为 O(1),pop和peek为 O(n)用一个队列备份数据,另一个实现栈的先进后出。用一个队列备份数据,另一个实现栈的先进后出。pop为 O(n),其他为 O(1)用两个栈实现队列的先进先出。用两个栈实现队列的先进先出。

2024-04-12 16:13:21 153

原创 代码随想录算法训练营第九天|字符串的总结回顾

而且双指针的位置可以不固定,可以一个在首,一个在尾,也可以是相隔特定的距离;在解决环的问题,也可以用双指针。3.第一次听说“剪枝”是在回溯算法里,当时并不真正理解,现在已经明白,其实就是把不符合约束条件的减去。2.我觉得在链表和字符串的练习中,双指针非常好用,可以将时间复杂度n2降低为n。1.在过程较为简单时,即使字符串有很多的库函数,但也不要太过依赖。

2024-04-11 21:24:08 258

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

先把字符串中多余的空格删除,然后再把字符串全反过来,最后再把单词单独反过来。先都反转一下,然后再局部反转。用reverse函数。for循环时,让i每次走2k个单位。for循环时,让i每次走2k个单位。先都反转一下,然后再局部反转。使用双指针,交换两个指针。

2024-04-11 21:08:12 210

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

先遍历两个数组,计算两数之和,map存放两数之和的值和出现的次数,再遍历后两个数组,在map里查询是否出现了0-后两个数组的和,用一个变量存放四元组出现的次数。首先快速找到某个数想到哈希结构,数值很大,把数组排除,需要存放两数之和,和出现的次数,需要key和value。时间复杂度O(n2)空间复杂度O(n2)时间复杂度O(n2)时间复杂度O(n2)时间复杂度O(n3)

2024-04-10 22:02:16 263 1

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

用哈希法来判断某一个数是否重复出现,若重复出现,就return false,否则,若出现sum值为1,return true;定义一个数组,让这个数组记录s字符串里各个字符出现的次数,然后再遍历t字符串,做减减操作。定义一个数组,让这个数组记录s字符串里各个字符出现的次数,然后再遍历t字符串,做减减操作。让其中一个数组哈希化,存入set里,再让另一个数组比对,看是否有相等的,相等的,再存入一个数组里。将遍历过的元素存放在map里,key存放元素的值,value存放下标。快速找到某一个数,用哈希结构。

2024-04-09 20:56:41 298

空空如也

空空如也

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

TA关注的人

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