自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营_day39

0-1背包 : 对 j 的循环是从大到小完全背包 : 对 j 的循环是从小到大组合:先物品 i 再背包 j排列:先物品 j 再背包 i你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。决

2024-09-07 10:45:40 549

原创 代码随想录算法训练营_day38

凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])从递推公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都都是false了。dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。换句话说,其值等于一个整数自乘的积。

2024-09-06 11:01:58 897

原创 代码随想录算法训练营_day37

dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选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]而不会出现{5, 1}的情况。

2024-09-05 11:14:45 562

原创 代码随想录算法训练营_day36

接下来就是如何初始化dp[j]呢,因为重量都不会是负数,所以dp[j]都初始化为0就可以了,这样在递归公式dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);相对于 01背包,本题中,石头的重量是 stones[i],石头的价值也是 stones[i] ,可以 “最多可以装的价值为 dp[j]” == “最多可以背的重量为dp[j]”01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

2024-09-04 12:56:57 1166

原创 代码随想录算法训练营_day35

首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。如图:在看其他情况。状态转移方程。

2024-09-03 11:22:41 529

原创 代码随想录算法训练营_day34

从递归公式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]条不同的路径。

2024-09-03 11:21:36 358

原创 代码随想录算法训练营_day32

F(0) = 0,F(1) = 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给定 ,请计算 。动规五部曲:这里我们要用一个一维dp数组来保存递归的结果dp[i]的定义为:第i个数的斐波那契数值是dp[i]为什么这是一道非常简单的入门题目呢?因为题目已经把递推公式直接给我们了:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];题目中把如何初始化也直接给我们了,如下:确定遍历顺序从递归公式dp[i] = dp[i - 1] + dp[i - 2]

2024-08-31 11:19:21 854

原创 代码随想录算法训练营_day31

题目信息 56. 合并区间题目链接: https://leetcode.cn/problems/merge-intervals/description/题目描述:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间解题思路先排序,让所有的相邻区间尽可能的重叠在一起,按左边

2024-08-30 12:14:20 798

原创 代码随想录算法训练营_day30

此时问题就是要求非交叉区间的最大个数。这里记录非交叉区间的个数还是有技巧的,如图:区间,1,2,3,4,5,6都按照右边界排好序。当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢?就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。接下来就是找大于区间1结束位置的区间,是从区间4开始。

2024-08-29 13:19:15 1043

原创 代码随想录算法训练营_day29

局部最优可推出全局最优,找不出反例,那就试试贪心。一些同学可能也会疑惑,你怎么知道局部最优就可以推出全局最优呢?有数学证明么?在贪心系列开篇词。

2024-08-28 13:06:35 614

原创 代码随想录算法训练营_day28

局部最优推出全局最优,找不出反例,试试贪心!如图:i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。如果 cover 大于等于了终点下标,直接 return true 就可以了。

2024-08-27 11:33:12 651

原创 代码随想录算法训练营_day27

其实并不会,因为还有一个变量 result 一直在更新 最大的连续和,只要有更大的连续和出现,result 就更新了,那么 result 已经把 4 更新了,后面 连续和变成 3,也不会对最后结果有影响。在计算是否有峰值的时候,大家知道遍历的下标 i ,计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果。图中,我们可以看出,版本一的代码在三个地方记录峰值,但其实结果因为是 2,因为 单调中的平坡 不能算峰值(即摆动)。

2024-08-26 11:00:40 368

原创 代码随想录算法训练营_day25

continue;continue;都是可以的,这也是很多同学做这道题目困惑的地方,知道也行而也行,但是就想不明白为啥。所以我通过举[1,1,1]的例子,把这两个去重的逻辑分别抽象成树形结构,大家可以一目了然:为什么两种写法都可以以及哪一种效率更高!这里可能大家又有疑惑,既然也行而也行,那为什么还要写这个条件呢?直接这样写 不就完事了?continue;其实并不行,一定要加上或者。

2024-08-24 12:21:54 1044

原创 代码随想录算法训练营_day24

求排列问题的时候,就要从0开始,因为集合是有序的,{1, 2} 和{2, 1}是两个集合,排列问题我们后续的文章就会讲到的。从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!情况就不同了,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。

2024-08-23 11:50:28 455

原创 代码随想录算法训练营_day23

中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 的不同组合数少于 个本题和77.组合 (opens new window),216.组合总和III (opens new window)的区别是:本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。本题搜索的过程抽象成树形结构如下: 注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过targ

2024-08-22 12:24:06 948

原创 代码随想录算法训练营_day22

组合问题是回溯法解决的经典问题,我们开始的时候给大家列举一个很形象的例子,就是n为100,k为50的话,直接想法就需要50层for循环。从而引出了回溯法就是解决这种k层for循环嵌套的问题。然后进一步把回溯法的搜索过程抽象为树形结构,可以直观的看出搜索的过程。接着用回溯法三部曲,逐步分析了函数参数、终止条件和单层搜索的过程。

2024-08-21 13:20:41 1075

原创 代码随想录算法训练营_day21

在。

2024-08-20 11:08:20 307

原创 代码随想录算法训练营_day20

剩下的情况,就是cur节点在区间(p->val <= cur->val && cur->val <= q->val)或者 (q->val <= cur->val && cur->val <= p->val)中,那么cur就是最近公共祖先了,直接返回cur。如图,我们从根节点搜索,第一次遇到 cur节点是数值在[q, p]区间中,即 节点5,此时可以说明 q 和 p 一定分别存在于 节点 5的左子树,和右子树中。终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回。

2024-08-19 13:06:20 1169

原创 代码随想录算法训练营_day18

那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面讲解。但我们还要返回最近公共节点,可以利用上题目中返回值是TreeNode * ,那么如果遇到p或者q,就把q或者p返回,返回值不为空,就说明找到了q或者p。判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。

2024-08-17 11:54:59 627

原创 代码随想录算法训练营_day17

因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了(如果t2也为NULL也无所谓,合并之后就是NULL)。题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。这表示一个数组大小是1的时候,构造了一个新的节点,并返回。其实本题是同样的道理,我们在寻找一个不符合条件的节点,如果没有找到这个节点就遍历了整个树,如果找到不符合的节点了,立刻返回。

2024-08-16 12:19:15 714

原创 代码随想录算法训练营_day16

找到。

2024-08-15 14:10:26 1139

原创 代码随想录算法训练营_day15

关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。当然是其左子树高度和其右子树高度的差值。判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int。

2024-08-14 19:09:26 737

原创 代码随想录算法训练营_day14

代码随想录算法训练营_day14

2024-08-13 12:00:01 792

原创 代码随想录算法训练营_day13

我们以中序遍历为例,使用栈的话,

2024-08-12 12:56:45 483

原创 代码随想录算法训练营_day11

寻找前k个最大元素流程如图所示:(图中的频率只有三个,所以正好构成一个大小为3的小顶堆,如果频率更多一些,则用这个小顶堆进行扫描)

2024-08-10 08:28:54 422

原创 代码随想录算法训练营_day10

栈(Stack)和队列(Queue)都是Java中常用的数据结构,它们在处理数据时遵循不同的原则。

2024-08-09 09:48:50 821

原创 代码随想录算法训练营_day09

KMP的理解方法就是把这一个串自己当作文本串(i)和模式串(j) 发现两者不匹配 那就回退到前缀相同的位置 即数组中前一个下标。next数组存放的元素是某个阶段上重复的元素个数,由于能组成重复元素的长串next数组一定是单调递增的,取next最后一个元素就是最长相同前后缀(即重复的元素个数,记为max),len - max就是最小重复子串长度,如果len能被最小重复字串长度整除,说明长串均可由其构成。

2024-08-08 10:29:53 813

原创 代码随想录算法训练营_day08

这一步相当于 s[r] = s[r] ^ s[l],即 s[r] = b ^ (a ^ b)。根据异或的性质,b ^ (a ^ b) = (b ^ b) ^ a = 0 ^ a = a 此时,s[l] = a ^ b,s[r] = a。这一步相当于 s[l] = s[l] ^ s[r],即 s[l] = (a ^ b) ^ a。根据异或的性质,(a ^ b) ^ a = b 此时,s[l] = b,s[r] = a。这一步相当于 s[l] = s[l] ^ s[r],即 s[l] = a ^ b。

2024-08-07 08:10:53 1009

原创 代码随想录算法训练营_day07

本题是使用哈希法的经典题目,这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于题目18. 四数之和,题目15.三数之和,还是简单了不少!如果本题想难度升级:就是给出一个数组(而不是四个数组),在这里找出四个元素相加等于0,答案中不可以包含重复的四元组,大家可以思考一下,后续的文章我也会讲到的。本题解题步骤:题目信息 383. 赎金信题目链接: https://leetcode.cn/problem

2024-08-06 10:47:57 799

原创 代码随想录算法训练营_day06

先看暴力的解法,两层for循环,同时还要记录字符是否重复出现,很明显时间复杂度是 O(n^2)。暴力的方法这里就不做介绍了,直接看一下有没有更优的方式。数组其实就是一个简单哈希表,而且这道题目中字符串只有小写字符,那么就可以定义一个数组,来记录字符串s里字符出现的次数。需要定义一个多大的数组呢,定一个数组叫做record,大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。为了方便举例,判断一下字符串s= “aee”, t = “eae”。操作动画如下:定义一个数组叫做re

2024-08-05 22:34:29 873

原创 代码随想录算法训练营_day04

可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。其实这种情况和n为1的时候 效果是一样的,一样可以通过这个方法找到 环形的入口节点,只不过,index1 指针在环里 多转了(n-1)圈,然后再遇到index2,相遇点依然是环形的入口节点。为什么fast 走两个节点,slow走一个节点,有环的话,一定会在环内相遇呢,而不是永远的错开呢。

2024-08-03 12:24:42 977

原创 代码随想录算法训练营_day03

headval。

2024-08-02 22:29:28 691

原创 代码随想录算法训练营_day02

找出该数组中满足其总和大于等于 的长度最小的 子数组 ,并返回其长度**。**如果不存在符合条件的子数组,返回 。复杂度分析时间复杂度: O(n^2)空间复杂度: O()解题思路一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。复杂度分析时间复杂度: O(n)空间复杂度: O()解题思路所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。在暴力解法中,是一个for循环滑动窗口的起

2024-08-01 13:35:54 1046

原创 八股学习计划

40天学习计划计算机网络[[Day01-计算机网络]] TCP/IP模型和OSI模型 #计算机网络 #中高频 从输入URL到页面展示发生了什么 #计算机网络 #高频[[Day02-计算机网络]] HTTP请求报文和响应报文是怎样的 #计算机网络 #中高频 HTTP请求方式有哪些 #计算机网络 #中高频 GET请求和POST请求的区别 #计算机网络 #高频[[Day03-计算机网络]] HTTP请求中常见的状态码 #计算机网络 #中高频 什么是强缓存和协商缓存 #计算机网

2024-07-31 22:06:56 724

原创 Day01

八股day01

2024-07-31 21:38:29 331

原创 代码随想录算法训练营_day01

一、模版(认真看看3种情况之间的关系)左右闭区间[a, b]- 循环条件- ⭐- 边界更新操作左闭右开:[a, b)- 循环条件- ⭐(左右相等没意义)- 边界更新操作- ⭐(开区间不需要越位)左开右闭:(a, b](一般不考虑这种情况,前两种已经足够)- 循环条件- ⭐(左右相等没意义)- 边界更新操作- ⭐(开区间不需要越位)二、⭐⭐需要考虑的边界值条件数组为空(nums: [])指针越界(start > length - 1;

2024-07-31 16:42:33 1159

原创 代码随想录算法训练营_day01

题目描述:给你一个数组 `nums` 和一个值 `val`,你需要 **[原地](https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95)** 移除所有数值等于 `val` 的元素。- 题目描述: 给你一个按 **非递减顺序** 排序的整数数组 `nums`,返回 **每个数字的平方** 组成的新数组,要求也按 **非递减顺序** 排序。与方法一不同的是,**方法二避免了需要保留的元素的重复赋值操作**。

2024-07-31 16:40:56 366

空空如也

空空如也

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

TA关注的人

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