自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 子集的问题---回溯

你这道里面的问题,可以总结成 5 类。

2026-06-02 19:42:05 250 1

原创 全排列 --- 回溯

你已经知道要用:resultuseddfs说明大方向是对的。你卡住的是:回溯不是随便递归,而是必须严格按照判断结束 → 枚举选择 → 做选择 → 递归 → 撤销选择这个顺序写。以后你写全排列,先默写这个模板:if (路径长度够了) {保存路径的拷贝;return;for (每一个选择) {if (这个选择不能用) {continue;做选择;dfs();撤销选择;你这次的核心错误可以记成四句话:结束条件放 for 前面。

2026-06-02 16:08:31 206

原创 岛屿数量 -- 图论

思路:我觉得有一个思路很好,就是对于我们熟悉的DFS(深度优先搜索)问题通常是在树结构或者图结构上进行的。而今天我们要讨论的DFS问题,是一种在网络结构中进行的。对于格子 (r, c) 来说(r 和 c 分别代表行坐标和列坐标),四个相邻的格子分别是 (r-1, c)、(r+1, c)、(r, c-1)、(r, c+1)。二叉树本身就是一个递归定义的结构:一棵二叉树,它的左子树和右子树也是一棵二叉树。要写好网络上的DFS遍历,我们首先要理解二叉树上的DFS遍历方法,在类比写出网格结构上的DFS遍历。

2026-06-01 00:17:50 426

原创 二叉树的中序遍历

思路,拿到这道题不要觉得是二叉树就很难,中序遍历就是先遍历左节点,然后根节点,然后右节点。

2026-05-27 11:12:32 24

原创 相交链表---链表

请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。- 相交的起始节点的值。

2026-05-26 19:10:50 282

原创 最大子数组和

思路:因为是连续且求最大 所以用一维的dp来写。

2026-05-26 18:11:55 21

原创 和为k的子数组--前缀和

思路: 方法一: 这道题可以用哈希解决,可以把原数组放入到hashmap中,然后遍历原数组,判断hashmap中是否存在k-当前原数组遍历到的数 且不是原数组数本身。这个方法不行因为hashmap中value不是唯一的所以,无法通过value获取key。暴力什么呢,暴力从每个位置i开始,往后不断累加,当累加和等于k时,答案加1。发现有一个细节没有看清楚,就是要求子数组是数组中连续的元素序列。这个连续序列没有说长度大小,所以这道题比较适合暴力的写法,方法二:先给数组排序然后双指针。i 表示子数组的起点。

2026-05-26 11:45:53 28

原创 找到字符串中所有字母异位词

4.最重要的是判断顺序反了,之前是先判断窗口长度是否等于3 再判断如果窗口长度大于3,我要右移动窗口,这样会有一个很严重的问题,就是当窗口长度经过第二次判断和变化之后长度就变为3,这时候要对两个数组进行比较是否相等,但是因为右移动完窗口后面要进入下一个循环了所以错过了这次判断,下一次循环右指针又会加1,相当于后面的循环一直是只进行第二个if判断,必然是有问题的,所以要修改该一下顺序。判断两个数组是否相等 Arrays.equals(a,b);1. 混用 s.length() p.length()

2026-05-25 11:44:08 14

原创 编辑距离----dp

接下来思考一下初始化应该怎么写:举个例子“”->"ros“ 只能不断插入 即 插入r 插入o 插入s 所以需要3步。因此dp[0][j] = j 同理 dp[i][0] = i。因为dp[i][j] 表示 word1 前 i 个字符 和 word2 前 j 个字符 的结果 这里的i j不是数组下标,而是前几个字符。于是我们定义dp[i][j] 他表示什么呢 他表示word1的前i个字符变成word2前j个字符所需要的最小操作数。编辑距离:是求word1变成word2最少需要几步。

2026-05-24 12:24:22 27

原创 最长公共子序列---dp

思路:看似好像可以用双指针或者map集合写,但仔细想一下还是行不通。dp[i]表示text1在第i个位置上最长的公共子序列。首先记住一句话,两个字符串做比较,求最长公共子序列,通常用二维dp。

2026-05-24 01:48:21 34

原创 dp反思与总结

很多题第一步不是写代码,而是先定义:dp[i] 或 dp[i][j] 表示什么?这是 DP 里非常重要的思维。不是从头想,而是反过来问:到达当前状态之前,最后一步可能是什么?比如「爬楼梯」:题目文字:每次可以爬 1 阶或 2 阶数学翻译:到第 i 阶,最后一步可能从 i-1 来,也可能从 i-2 来所以:再比如「完全平方数」:凑成 i,最后一次可能用了 1、4、9、16...所以:记忆:想不出来时,就问:最后一步从哪里来?

2026-05-22 17:26:07 271

原创 不同路径|| -- dp

首先我们思考:从左上角到右下角需要满足什么条件,例如一个m =3,n = 3的矩阵,在 左上角走到右下角需要向右移动两步和向下移动两步。那么dp[i][j] 代表什么,从左上角走到当前位置的路径数量。比如dp[1][2]就是走到1,2这个位置上有多少条路径。看到这道题,和上一道题很相似,但是需要用代码实现,如何记录从左上角到右下角有几条路径。

2026-05-22 17:16:29 28

原创 最小路径和---dp

复习一下动态规划的宗旨,将大问题拆分成一个一个小问题,然后将小问题的答案记录下来,这时候我们基本可以得到小问题的dp[i]式子的含义。然后我们再去思考由小问题如何一步一步推导出大问题,这时候状态转移方程就出来了。题目要求的是:找出从左上角到右下角,使得路径上的数字最小。那么dp[i][j]就是在当前位置上 路径经过的最小值。然后和上道题目一样,我们需要处理一下边界值。思路:这道题目和上一道题目很像。

2026-05-22 16:12:51 24

原创 三角形的最小路径和---二维dp

那么想一下状态转方程应该怎么写,由题意我们知道,当前位置可以由上一行的第i个位置得到,也可以由上一行的第j - 1个位置得到,于是我们可以写出状态转移方程是,dp[i][j] = Math.min(dp[i - 1][j],dp[i - 1][j - 1]) + target[i][j];思路:拿到这道题没什么思路 我觉得dp[i][j]应该表示的是在当前位置上满足条件的最小的路径之和,最左边那一列的数只能由上一行的第j个位置得到,最右边那一列的数只能由上一行的第 j- 1个位置得到。

2026-05-21 20:26:09 33

原创 单词拆分----dp

就是在问:“能不能把前i个字符切成两半,使得前半部分可拆分(dp[j]=true),后半部分本身就是一个单词(在字典里)?如果能,那么dp[i]就是true。

2026-05-20 18:06:31 309

原创 最长递增子序列

思路:由于之前做的一维动态规划的问题 都是背包问题,所以我把这道题也带入到背包问题中,进行思路的构建,于是我把dp中的i视作当前的位置,dp[i]为当前位置下最长的严格递增子序列的长度。这样不对,因为即使k是全局变量,但是如果不满足if的条件那么k永远不会被赋值,而我为什么要给dp[2]赋值,正是因为我的数组长度超过了2 我先给2进行初始化。犯了个低级错误 ,应该严肃多重复反思。但是这样的方法只过了一半的样例,于是我感觉是我的方法不对,于是我去问ai,

2026-05-20 15:22:54 316

原创 打家劫舍----背包dp

首先读了一遍题目发现是读懂了,刚开始以为要用贪心,但是不对,贪心是求局部最优解,但很明显这道题不是求局部最优,不是局部最优得到,而是选择局部最优得到,因为需要选择局部最优,所以需要使用动态规划。那么动态规划的下标和dp数组的含义应该如何确定呢,用为题目要求的是当前房间下能盗取的最大的钱数,所以下标i表示当前是在第几个房间,那么dp[i]就是表示在当前这个房间下能取得的最大值。这个式子在1,2是成立的,那么如果举出的例子是1,2,2呢。

2026-05-17 15:29:25 38

原创 动态规划基础知识---爬楼梯

思路:这题一读题目就不是传统的方法可以解决的,是动态规划来解决的,为什么是动态规划来解决呢,是因为当前的状态由前一次状态决定的,但这道题怎么写呢,我没有思路,但我根据上面的做题方法走一遍。然后我看了代码随想录的动态规划基础知识和学习了斐波那契如何写,然后学习了爬楼梯的思路,接下来我要自己写了。每次你可以爬 1 或 2 个台阶。1. 1 阶 + 1 阶 + 1 阶。解释:有两种方法可以爬到楼顶。解释:有三种方法可以爬到楼顶。1. 1 阶 + 1 阶。2. 1 阶 + 2 阶。3. 2 阶 + 1 阶。

2026-05-16 13:49:07 27

原创 验证二叉搜索树

思路:看到这道题的思路是,还是一如既往的中序遍历,因为对于严格的二叉搜索树,在中序遍历的过程中,当前节点一定是严格大于前面那个节点的,所以需要在全局变量定义前面那个节点,然后把当前节点和前面那个节点进行对比,这里我们设置一个flag = true;来记录,如果一旦发现一个当前节点小于等于前面那个节点,就把flag设置为false。乘以 2 后,理论值为 -4294967296,但这个数超出了 int 范围(-2^31 ~ 2^31-1)。他说我的问题是:Integer.MIN_VALUE * 2溢出。

2026-05-15 16:17:32 39

原创 二叉搜索树中第K小的元素

思路:看到这道题我的思路是:对二叉搜索树进行中序遍历然后在遍历的那个函数下设置一个变量t初始值为0,再设置一个全局变量记录当t递增到k的时候的值是多少,然后返回t即可。问题1:java是值传递。

2026-05-15 11:48:23 48

原创 二叉搜索树的最小绝对差

由于写不出来,所以参考了题解,题解的思路很好,因为这是二叉搜索树,所以对二叉搜索树进行中序遍历排出的数组就是有序的,在有序数组下,我们只需要比较相邻两个数值的差,得到的就是最小的差值。思路:看到这道题我的思路是,层序遍历这个二叉树,然后将不为空的数值存入数组,然后再遍历一遍数组求出每个数与其他数的最小差值。

2026-05-15 11:02:56 14

原创 二叉树的锯齿层序遍历

思路:看到这道题的思路是,层序遍历 然后如何达到题目中说的锯齿的要求就是,用一个数字的与2除模来确定当前的行数是单数行还是偶数行,如果是单数行则先存根节点的右子节点,然后再存根节点的左子节点。首先补充知识:反转动态list数组的方法是 Collections.reverse();题目没有说为非空二叉树一定要提前判断是否是空!一开始的错误代码和调试。

2026-05-14 16:01:11 25

原创 二叉树的右视图

实现思路是:先进行广度优先遍历,然后将每一层的最后一个节点保存到队列中。看了题解的思路是:把每一层的最后一个节点值保存在答案中。看到这道题我的思路是:没有思路。看了题解 自己动手写出来。

2026-05-14 15:14:36 29

原创 二叉树的最近共公共祖先

3.本题分为两种情况;情况一从上到下遍历的时候也就是前序遍历,当前节点的左节点和右节点是q或者p那就返回q和p。情况二: 当前节点是q(p)然后 他的子孙是q(p),现在说是情况一和情况二的代码是一样的。4.那么最后的公共祖先节点是如何从下面一步一步传上去的呢,就是如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然。其实这道题,先序遍历和后序遍历都用到了,先序遍历是通过根节点找到左节点和右节点,后序遍历就是根据找到的左节点和右节点来判断是否找到公共祖先。

2026-05-14 12:48:29 41

原创 求根节点到叶子节点数字之和

④如果不是叶子,就需要继续向下遍历左右子树,然后把左右子树返回的所有路径数字加起来,作为当前节点往下的总贡献。思路:拿到这道题我首先思考的就是需要通过递归遍历的方式来写这道题,但具体怎么写出来我没有很清晰的思路,应该是先从根节点遍历拼凑从根节点到每一个叶子节点的路径上的数字,可以将将每一条路径得到的数字存入到数组中,然后遍历数组将他们相加,也可以用一个sum记录 每次到根节点就 sum += 这个路径下的值。递归函数返回的是“当前节点为起点的所有叶子路径数字之和,那么。2.对应你的思路中的关键点。

2026-05-14 11:30:38 41

原创 leeCode hot 100 !!!持续更新中

拿到这道题目,思路是,将数组中所有的数值的下标作为key,数值作为value,存进hashmap,然后遍历数组,用target减去遍历到的数值得到差值,然后看在hashmap中是否存在这个差值且不等于当前遍历到的数值,如果有返回i和map的key。思路:先将数组存在set中去重,然后遍历set里的每个元素,先通过查找这个元素减一是否存在在集合中来看它是否是序列的开头,如果是那么就用while循环通过查找它后面的元素来看这个序列长度,然后更新最长的序列长度即可。hashmap的定义有点忘了先复习一下,,,

2025-11-06 21:26:16 782

原创 一些题目~~~

进程创建通常由系统初始化(操作系统启动时创建初始进程)、用户请求(用户运行程序或执行命令(如打开浏览器))、系统调用等触发(进程主动调用创建进程的系统接口(如for。k()),网页中断属于资源占用或网络中断问题(都会在原有进程上进行重启或者重试,不会创建新进程),可能会影响现有进程但不会触发新进程生成。这里声明了一个n*n的矩阵,因此空间复杂度为O(n²) ,因为存储该矩阵所需的空间随 n 的平方增长。如果你声明了一个长度为n的数组,那么空间复杂度是O(n),因为数组的大小随n的增加而增加。

2025-11-06 18:33:18 136

原创 JavaACM模式的输入输出

牛客ACM模式-自己处理输入输出。

2025-11-06 15:04:22 162

原创 课程表---bfs

若整个课程安排图是有向无环图(即可以安排),则所有节点一定都入队并出队过,即完成拓扑排序。换个角度说,若课程安排图中存在环,一定有节点的入度始终不为 0。并不是真正的从邻接表删除此节点pre,而是将此节点对应所有邻接节点cur的入度-1,即indegrees[cur] -=1;因此,拓扑排序出队次数等于课程个数,返回 numCourses == 0 判断课程是否可以成功安排。当入度-1后邻接节点cur的入度为0,说明cur所有的前驱节点已经被“删除”,此时将cur入队。在选修某些课程之前需要一些先修课程。

2025-11-04 16:06:41 348

原创 被围绕的区域---bfs

题目中说被包围的区间不会存在于边界上,所以我们会想到对边界上的O进行特殊处理,只要把边界上的O进行特殊处理了,那么剩下的O替换成X就可以了。问题转化为如何寻找和边界联通的O,我们需要考虑如下情况。这个时候O是不做替换的。因为和边界是连通的。为了记录这种状态,我们把这种情况下的O替换成#作为占位符,待搜索结束后,遇到O替换为X(和边界不连通的O);遇到#,替换回为O(和边界连通的O)。如何寻找和边界联通的O?从边界出发,对图进行bfs即可。你不需要返回任何值。

2025-11-04 14:41:20 283

原创 Linux常用命令

将Linux常用命令分为以下几类:目录操作命令文件操作命令拷贝移动命令打包压缩命令文本编辑命令查找命令。

2025-11-02 16:15:51 187

原创 单词接龙----图论

首先题目中并没有给出点与点之间的连线,而是要我们自己去连,条件是字符只能差一个,所以判断点与点之间的关系,要自己判断是不是差一个字符,如果差一个字符,那就是有链接。然后就是求起点和终点的最短路径长度,这里无向图求最短路,广搜最为合适,广搜只要搜到了终点,那么就一定是最短路径。本题如果用深搜,会比较麻烦,要在到达终点的不同路径中选择一条最短路。这个图中可以看出 hit 到 cog的路线,不止一条,有三条,一条是最短的长度为5,两条长度为6。2.本题给出集合是数组型的,可以转成set结构,查找更快一些。

2025-11-01 23:39:22 459

原创 岛屿数量---DFS & BFS

以下内容是从网站中学习的如果有错误欢迎批评指正~~~~题目描述:给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。输入描述:第一行包含两个整数 N, M,表示矩阵的行数和列数。后续 N 行,每行包含 M 个数字,数字为 1 或者 0。输出描述:输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出 0。输出示例:3提示信息根据测试案例中所展示,岛屿数量共有 3 个,所以输出 3。

2025-10-30 20:16:11 406

原创 操作系统常见面试题总结---持续更新

1.操作系统(Operating System,简称OS)是管理计算机硬件与软件的资源的程序,是计算机的基石。2.操作系统本质上是一个运行在计算机上的软件程序,主要用于管理计算机硬件和软件资源。举例:运行在你电脑上的所有的应用程序都通过操作系统来调用系统内存以及磁盘等等硬件。3.操作系统存在屏蔽了硬件层的复杂性。操作系统就像是硬件使用的负责人,统筹这各种相关事项。4.操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。

2025-10-30 17:05:03 240

原创 数据库部分基础知识---持续更新中

数据库:数据库(DataBase 简称DB)就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。数据库管理系统:数据库管理系统(Database Management System 简称DBMS)是一种操纵和管理数据库的而大型软件,通常用于建立、使用和维护数据库。数据库管理员:数据库管理员(Database Administrator 简称 DBA)负责全面管理和控制数据库系统。数据库系统:(Data Base System 简称DBS)通常由软件、数据库和数据管理员(DBA)组成。

2025-10-30 16:40:57 620

原创 商品折扣后的最终价格----单调栈

商品 0 的价格为 price[0]=8 ,你将得到 prices[1]=4 的折扣,所以最终价格为 8 - 4 = 4。商品 1 的价格为 price[1]=4 ,你将得到 prices[3]=2 的折扣,所以最终价格为 4 - 2 = 2。商品 2 的价格为 price[2]=6 ,你将得到 prices[3]=2 的折扣,所以最终价格为 6 - 2 = 4。单调栈能解决那些问题:通常是一个一维数组,求任意数他左边或者右边第一个比自己大或者比自己小的位置。,你将没有任何折扣。时间复杂度:O(n)

2025-10-25 23:42:18 322

原创 初学JVM---什么是JVM

定义:Java Virtual Machine - java程序的运行环境(java二进制字节码运行环境)②自动内存管理,垃圾回收功能。③中高级程序员的必备技能。①一次编写,到处运行。②理解底层的实现原理。

2025-10-25 22:44:58 322

原创 划分字母区间---超全详细解

这道题目leetcode标记为贪心算法,说实话,我没有感受到贪心,找不出局部最优推出全局最优的过程。就是用最远出现距离模拟了圈字符的行为。但这道题目的思路是很巧妙的,所以有必要介绍给大家做一做,感受一下。

2025-10-24 16:15:01 453

原创 跳跃游戏||----超全写详细解

相信大家可以发现,这道题目相当于跳跃游戏难了不止一点。但代码又十分简单,贪心就是这么巧妙。以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点,这个范围内最少步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。

2025-10-24 15:22:16 447

原创 跳跃游戏-----超全详细解

这道题目关键点在于:不用拘泥于每次究竟跳几步,而是看覆盖范围,覆盖范围内一定是可以跳过来的,不用管是怎么跳的。大家可以看出思路想出来了,代码还是非常简单的。一些同学可能感觉,我在讲贪心系列的时候,题目和题目之间貌似没有什么联系?是真的就是没什么联系,因为贪心无套路!没有个整体的贪心框架解决一系列问题,只能是接触各种类型的题目锻炼自己的贪心思维!

2025-10-24 14:33:19 490

空空如也

空空如也

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

TA关注的人

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