自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 三层交换机配置DHCP服务

2)修改F0/1 和F0/2为access口,F0/24为trunk口。第一步:进入二层交换机Switch。第二步:进入三层交换机。

2023-12-07 18:03:33 1507

原创 Java数组与List互换

toArray():将list转换为数组。asList():将数组转成list。

2023-12-02 19:00:26 473

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

如果i为1,第1天买入股票,那么递归公式中需要计算 dp[i - 1][1] - prices[i] ,即 dp[0][1] - prices[1],那么大家感受一下 dp[0][1] (即第0天的状态二)应该初始成多少,只能初始为0。那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);今天卖出了股票(状态三),同上分析,dp[0][2]初始化为0,dp[0][3]也初始为0。

2023-09-17 11:07:17 144

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

一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]);所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][1]呢?此时还没有买入,怎么就卖出呢?

2023-09-15 11:30:50 123

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

由递推公式 dp[i][0] = max(dp[i - 1][0], -prices[i]);和 dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);

2023-09-15 11:25:08 66

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

🔗题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台💡解题思路:动态规划动规五部曲分析如下:1.确定dp数组(dp table)以及下标的含义dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。2.确定递推公式决定dp[i]的因素就是第i房间偷还是不偷。如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。如

2023-09-15 11:08:17 59

原创 代码随想录算法训练营第四十六天 | 139.单词拆分 & 关于多重背包,你该了解这些! & 背包问题总结篇!

从递推公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都都是false了。"apple", "pen" 是物品,那么我们要求 物品的组合一定是 "apple" + "pen" + "apple" 才能组成 "applepenapple"。"apple" + "apple" + "pen" 或者 "pen" + "apple" + "apple" 是不可以的,那么我们就是强调物品之间顺序。那么dp[0]有没有意义呢?

2023-09-15 10:57:28 234

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

凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])既然递归公式是 dp[i] += dp[i - j],那么dp[0] 一定为1,dp[0]是递归中一切数值的基础所在,如果dp[0]是0的话,其他数值都是0了。本题呢,dp[i]有几种来源,dp[i - 1],dp[i - 2],dp[i - 3] 等等,即:dp[i - j]所以遍历的内循环是正序。

2023-09-13 13:03:43 47

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

dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。因为递推公式dp[i] += dp[i - nums[j]]的缘故,dp[0]要初始化为1,这样递归其他dp[i]的时候才会有数值基础。下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j]初始化为0,这样才不会影响dp[i]累加所有的dp[i - nums[j]]。

2023-09-12 15:15:19 47

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

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台💡解题思路:动态规划确定dp数组以及下标的含义dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j]。可以回忆一下01背包中,dp[j]的含义,容量为j的背包,最多可以装的价值为 dp[j]。相对于 01背包,本题中,石头的重量是 stones[i],石头的价值也是 stones[i] ,可以 “最多可以装的价值为 dp[j]” == “最多可以背的重量为dp[j]”确定递推公式。

2023-09-12 10:31:52 39

原创 代码随想录算法训练营第四十二天 | 01背包问题,你该了解这些! 滚动数组 & 416. 分割等和子集

那么如果背包容量为target, dp[target]就是装满 背包之后的重量,所以 当 dp[target] == target 的时候,背包就装满了。01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);所以递推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);01背包中,dp[j] 表示: 容量为j的背包,所背的物品价值最大可以为dp[j]。在01背包,一维dp如何初始化,已经讲过,

2023-09-09 17:57:16 51

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

那么从1遍历j,比较(i - j) * j和dp[i - j] * j 取最大的。从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都变成0了。j的结束条件是 j < i - 1 ,其实 j < i 也是可以的,不过可以节省一步,例如让j = i - 1,的话,其实在 j = 1的时候,这一步就已经拆出来了,重复计算,所以 j < i - 1。

2023-09-07 12:51:18 29

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

从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

2023-09-07 10:39:10 50

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

动态规划五步曲🔗题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台💡解题思路:动态规划动规五部曲:这里我们要用一个一维dp数组来保存递归的结果dp[i]的定义为:第i个数的斐波那契数值是dp[i]状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];题目中把如何初始化也直接给我们了,如下:确定遍历顺序从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序

2023-09-06 15:28:29 60

原创 代码随想录算法训练营第三十六天 | 738.单调递增的数字

代码随想录。

2023-09-06 11:00:30 61

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

先进行排序,再遍历数组,如果该元素的左边界小于上一个元素的右边界,count++,表示移除,再更新该元素的右边界。定义变量保存最大右边界,遍历数组,如果该元素左边界大于最大右边界,表示无重合,则更新最大右边界和起始位置。一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起。此时前面出现过所有字母,最远也就到这个边界了。在遍历的过程中相当于是要找每一个字母的边界,💡解题思路:贪心算法。💡解题思路:贪心算法。💡解题思路:贪心算法。

2023-09-05 16:26:09 38

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

局部最优可推出全局最优,找不出反例,那就试试贪心。

2023-09-05 11:31:42 30

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

如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。如果ratings[i] > ratings[i - 1] 那么[i]的糖 一定要比[i - 1]的糖多一个,所以贪心:candyVec[i] = candyVec[i - 1] + 1。再确定左孩子大于右孩子的情况(从后向前遍历)

2023-09-04 16:39:16 25

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

局部最优推出全局最优,找不出反例,试试贪心!如图:

2023-09-04 11:27:11 24

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

从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。在计算是否有峰值的时候,大家知道遍历的下标 i ,计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果。,也就是我们在删除的时候 要不删除左面的三个 2,要不就删除右边的三个 2。

2023-09-03 14:48:06 25

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

递归深度就是row控制棋盘的行,每一层里for循环的col控制棋盘的列,一行一列,确定了放置皇后的位置。因为如果一行一列确定下来了,这里尝试了9个数都不行,说明这个棋盘找不到解决数独问题的解!在树形图中可以看出我们需要的是一个二维的递归(也就是两个for循环嵌套着递归)每次都是要从新的一行的起始位置开始搜,所以都是从0开始。搜索皇后的位置,可以抽象为一棵树。💡解题思路:递归回溯。💡解题思路:递归回溯。

2023-09-03 11:12:36 76

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

不再使用startIndex,因为每次都从第一个数开始,使用used数组来判断该数是否使用过。套用模板,方法类似,但需加上树层的去重,这里我使用了set。💡解题思路:递归回溯。💡解题思路:递归回溯。💡解题思路:递归回溯。

2023-09-02 15:55:55 68

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

循环中 [startIndex, i] 这个区间就是截取的子串,需要判断这个子串是否合法。递归调用时,下一层递归的startIndex要从i+2开始(因为需要在字符串中加入了分隔符。这道题也比较简单,套用模板,使用used数组进行数层去重。),同时记录分割符的数量pointNum 要 +1。删掉就可以了,pointNum也要-1。最后就是在写一个判断段位是否是有效段位了。回溯的时候,就将刚刚加入的分隔符。这道题比较简单,直接套模板。💡解题思路:递归回溯。💡解题思路:递归回溯。💡解题思路:递归回溯。

2023-09-02 10:52:15 79

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

递归用来纵向遍历,for循环用来横向遍历,切割线(就是图中的红线)切割到字符串的结尾位置,说明找到了一个切割方法。终止条件:sum 等于 target,当sum 大于target时进行剪枝操作。数层去重,树枝不去重,定义used数组来区别。单层逻辑:每一次的start都从当前值开始。💡解题思路:递归回溯。💡解题思路:递归回溯。💡解题思路:递归回溯。

2023-08-31 14:53:47 23

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

其实这里sum这个参数也可以省略,每次targetSum减去选取的元素数值,然后判断如果targetSum为0了,说明收集到符合条件的结果了,我这里为了直观便于理解,还是加一个sum参数。例如 k = 2,n = 4的话,就是在集合[1,2,3,4,5,6,7,8,9]中求 k(个数) = 2, n(和) = 4的组合。处理过程就是 path收集每次选取的元素,相当于树型结构里的边,sum来统计path里元素的总和。本题就是在[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合。

2023-08-31 09:58:05 30

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

从下图中红线部分可以看出,在集合[1,2,3,4]取1之后,下一层递归,就要在[2,3,4]中取数了,那么下一层递归如何知道从[2,3,4]中取数呢,靠的就是startIndex。path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,在图中path存的就是根节点到叶子节点的路径。回溯法的搜索过程就是一个树型结构的遍历过程,在如下图中,可以看出for循环用来横向遍历,递归的过程是纵向遍历。函数里一定有两个参数,既然是集合n里面取k个数,那么n和k是两个int型的参数。

2023-08-29 11:24:26 50

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

如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。同时需要定义一个全局变量pre,用来保存cur节点的前一个节点的数值,定义为int型就可以了。这里定义的是左闭右闭的区间,所以当区间 left > right的时候,就是空节点了。然后如下代码相当于用节点3的左孩子 把下一层返回的 节点0的右孩子(节点2) 接住。首先取数组中间元素的位置,不难写出。

2023-08-18 10:56:14 42 1

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

那么如果 cur->val 大于 p->val,同时 cur->val 大于q->val,那么就应该向左遍历(说明目标区间在左子树上)。可以有,也可以没有,但递归函数如果没有返回值的话,实现是比较麻烦的,下面也会给出其具体实现代码。终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回。参数就是根节点指针,以及要插入元素,这里递归函数要不要有返回值呢?别忘了这是搜索树,遍历整棵搜索树简直是对搜索树的侮辱,哈哈。搜索树是有方向了,可以根据插入元素的数值,决定递归方向。

2023-08-16 11:25:19 44 1

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

频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了。那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面讲解。但我们还要返回最近公共节点,可以利用上题目中返回值是TreeNode * ,那么如果遇到p或者q,就把q或者p返回,返回值不为空,就说明找到了q或者p。

2023-08-14 10:30:45 21

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

因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了(如果t2也为NULL也无所谓,合并之后就是NULL)。题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。递归函数的参数传入的就是根节点和要搜索的数值,返回的就是以这个搜索数值所在的节点。3.确定单层递归的逻辑。

2023-08-10 11:38:24 24 1

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

不要去累加然后判断是否等于目标和,那么代码比较麻烦,可以用递减,让计数器count初始为目标和,然后每次减去遍历路径节点上的数值。注意确定切割的标准,是左闭右开,还有左开右闭,还是左闭右闭,这个就是不变量,要在递归中保持这个不变量。第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)递归函数是有返回值的,如果递归函数返回true,说明找到了合适的路径,应该立刻返回。如果最后count == 0,同时到了叶子节点的话,说明找到了目标和。第六步:递归处理左区间和右区间。

2023-08-06 09:47:50 92

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

分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返 回-1,表示已经不是二叉平衡树了。注意,只有当前遍历的节点是父节点,才能判断其子节点是不是左叶子。当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int。递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0。

2023-08-01 16:41:06 25 1

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

递归依旧是老大难,只能通过刷题不断地理解,总结,形成自己的思路。(二) 完全二叉树的求法。(一)普通二叉树的求法。

2023-08-01 10:15:37 61 1

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

递归三部曲:1.确定递归函数的参数和返回值2.确定终止条件3.确定单层递归的逻辑。

2023-07-31 10:27:29 73 1

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

我来举一个典型的例子如题:相信不少同学最后一个二叉树是不是完全二叉树都中招了。

2023-07-29 20:14:25 43

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

其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。那么这个维护元素单调递减的队列就叫做。今天是对队列的深入学习,明显感受到难度有所提升,也涉及到了一些没有接触过的知识点,一刷有点懵,写代码有点困难,但能理解思路。保持如上规则,每次窗口移动的时候,只要问que.front()就可以返回当前窗口的最大值。💡解题思路:优先级队列——堆(不是很懂),即单调递减或单调递增的队列。🤑 吹着空调学习已是一种奢侈。自己用暴力解法超时了。

2023-07-28 18:22:23 18 1

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

💡解题思路:遍历字符串数组,如果得到右括号,则看栈中的头元素是否为对应的右括号,若不是,则返回false,若是,则将头元素弹出,如果得到左括号,push进栈。和上题有效的括号思路相似,遍历数组,若栈中首元素与遍历的当前值相等,则弹出首元素,若不等,则入栈。平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )。逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。遇到数字,就入栈,遇到符号,就弹出两个数字进行运算。今天是对栈的深入学习,理解什么情况下可以用栈。

2023-07-28 10:07:27 17 1

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

💡解题思路:一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。💡解题思路:使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈。,这里要注意输入栈和输出栈的关系。再次复习了一下栈和队列的基础知识。😌 好好吃一顿犒劳追梦的自己。

2023-07-25 16:29:20 15

原创 代码随想录算法训练营第八天|344.反转字符串 & 541. 反转字符串II & 剑指Offer 05.替换空格 & 151.翻转字符串里的单词 & 剑指Offer58-II.左旋转字符串

💡解题思路:双指针设置收尾指针,依序交换。

2023-07-25 11:10:05 17

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

自己思考的时候设置了三个指针,然后绕昏了解不出来,看完卡哥的视频再写就清楚多了,但要注意最后sum为long型。② 再遍历num3和num4数组,如果0-(c+d)在map中出现过,就用count把key对应的value也就是出现次数统计出来。① 遍历num1和num2数组,key放a和b两数之和,value 放a和b两数之和出现的次数。💡解题思路:先对列表进行排序,再遍历,设置左右指针,重点在如何去重。这个思想还要再学习一下。💡解题思路:我自己做的时候使用的是哈希表的map,但看解答用的数组更方便一点。

2023-07-22 10:31:03 26 1

空空如也

空空如也

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

TA关注的人

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