- 博客(76)
- 收藏
- 关注
原创 回溯算法理论基础
例如:{1, 2} 和 {2, 1} 在组合上,就是一个集合,因为不强调顺序,而要是排列的话,{1, 2} 和 {2, 1} 就是两个集合了。因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。什么时候达到了终止条件,树中就可以看出,一般来说搜到叶子节点了,也就找到了满足条件的一条答案,把这个答案存放起来,并结束本层递归。回溯算法需要的参数不易确定,所以一般是先写逻辑,然后需要什么参数,就填什么参数。
2025-02-01 17:09:30
426
原创 二叉树的最小深度力扣--111
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。给定一个二叉树,找出其最小深度。叶子节点是指没有子节点的节点。
2025-01-25 18:38:17
318
原创 填充每个节点的下一个右侧节点指针力扣--116,117
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。同力扣102 层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了。给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。输入:root = [1,2,3,4,5,6,7]输出:[1,#,2,3,#,4,5,6,7,#]
2025-01-25 18:10:29
317
原创 在每棵树中找最大值
给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。输入: root = [1,3,2,5,3,null,9]同力扣102,层序遍历,取每一层的最大值。输入: root = [1,2,3]输出: [1,3,9]
2025-01-25 15:40:59
181
原创 N叉树的层序遍历力扣--429
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。与力扣102相似 孩子集合,遍历添加。给定一个 N 叉树,返回其节点值的。(即从左到右,逐层遍历)。
2025-01-25 15:15:26
186
原创 二叉树的层平均值
第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11。参照力扣102,只需要把数组的类型改为double,并且在层序遍历时计算平均值即可,注意。, 以数组的形式返回每一层节点的平均值。因此返回 [3, 14.5, 11]。给定一个非空二叉树的根节点。以内的答案可以被接受。如何保存当前层的节点数。
2025-01-25 14:55:36
180
原创 二叉树的右视图力扣--199
与力扣102大体相似,层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
2025-01-25 14:39:47
186
原创 二叉树的层序遍历力扣--102
先把根节点放入队列中,然后把他弹出,把他的左右孩子节点放进去,以此往复。最终结果需要一个二维数组,第一个维度记录哪层,第二个维度记录数据。然后弹出9,由于9无左右孩子,所以弹出20,放15和7,以此往复。层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。(即逐层地,从左到右访问所有节点)。需要借用一个辅助数据结构即队列来实现,比如题目所给例题,先把3放进队列。然后弹出3,放9和20。
2025-01-25 14:11:06
213
原创 二叉树的迭代遍历
,然后走他的左子树,左子树为空 ,看右子树,与此同时弹出1,加入2,看2的左子树,加入3(栈中是2,3),3的左子树为空,看右子树,也为空,弹出3,看2,2的右子树为空,弹出2,最后结果为。因为前两个是访问哪个就操作哪个,但是中序不是,访问树从其根节点开始,但是中序是标左中右的顺序,先操作的是最左边的,所以和他们不是一个模板。前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。前序和后序是一个模板,那么为什么中序不能是一个模板呢?
2025-01-24 10:21:57
383
原创 二叉树的递归遍历力扣--145,144,94
写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。单层递归的逻辑就是按照中左右的顺序来处理的。确定递归函数的参数和返回值。给你一棵二叉树的根节点。
2025-01-22 11:54:14
432
原创 滑动窗口最大值力扣--239
poll函数:如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作。add函数:添加进队列,把在他前面的比他小的数字全部弹出,保证队列的首部是这个滑动窗口u的最大值。保持如上规则,每次窗口移动的时候,只要问que.front()就可以返回当前窗口的最大值。的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的。滑动窗口的位置 最大值。滑动窗口每次只向右移动一位。长度为n的数组,他有n-k+1个滑块。
2025-01-20 19:36:05
234
原创 逆波兰表达式求值力扣--150
给你一个字符串数组tokens,表示一个根据表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。'+''-''*''/'9该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 96该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 622该算式转化为常见的中缀算术表达式为:= 17 + 5= 22。
2025-01-20 17:10:56
354
原创 删除字符串中所有相邻重复项力扣--1047
给出由小写字母组成的字符串s会选择两个相邻且相同的字母,并删除它们。在s上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。"abbaca""ca"例如,在"abbaca"中,我们可以删除"bb"由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串"aaca",其中又只有"aa"可以执行重复项删除操作,所以最后的字符串为"ca"。
2025-01-20 16:11:51
302
原创 右旋字符串
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。输出:输出共一行,为进行了右旋转操作后的字符串。
2025-01-17 14:45:49
129
原创 反转字符串中的单词力扣--151
给你一个字符串s,请你反转字符串中的顺序。是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的分隔开。返回顺序颠倒且之间用单个空格连接的结果字符串。输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。反转后的字符串中不能存在前导空格和尾随空格。如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
2025-01-17 14:31:29
236
原创 替换数字
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。对于输入字符串 "a5b",函数应该将其转换为 "anumberb"输入:一个字符串 s,s 仅包含小写字母和数字字符。输出:打印一个新的字符串,其中每个数字字符都被替换为了number样例输入:a1b2c3样例输出:anumberbnumbercnumber。
2025-01-17 11:34:47
307
原创 四数之和力扣--18
给你一个由n个整数组成的数组nums,和一个目标值target。请你找出并返回满足下述全部条件且的四元组bcd你可以按返回答案。
2025-01-16 15:38:00
396
原创 三数之和力扣--15
我们判断前一位是不是一样的元素,在看 {-1, -1 ,2} 这组数据,当遍历到 第一个 -1 的时候,只要前一位没有-1,那么 {-1, -1 ,2} 这组数据一样可以收录到 结果集里。如果和他的后一个比较,那么会把三元组中只要有两个数字相同的结果集去掉,比如{-1, -1 ,2},符合要求,但是会被去掉,所以不能和后一个比较。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]
2025-01-16 09:51:45
365
原创 反转字符串力扣--344
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。定义两个指针,一个指向开头,一个指向结尾,然后交换两个指针对应的数字,不断循环,直到交换完毕。编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。输入:s = ["H","a","n","n","a","h"]输入:s = ["h","e","l","l","o"]输出:["h","a","n","n","a","H"]输出:["o","l","l","e","h"]
2025-01-14 10:54:44
204
原创 四数相加力扣--454
但是和列表不同的是:列表只能存储相同的数据类型,而元组不一样,它可以存储不同的数据类型,比如同时存储int、string、list等,并且可以根据需求无限扩展。如果我们先遍历第一个数组,然后再遍历后三个数组, 遍历第一个数组时间的复杂度为n,后三个为n^3,算法总体时间复杂度为n^3,遍历前两个数组时,时间复杂度为n^2,遍历后两个数组时候时间复杂度也为n^2,算法总体时间复杂度为n^2。先遍历前两个数组,得到两数相加a,然后遍历后两个,得到b,看0-a是否在等于b,,请你计算有多少个元组。
2025-01-14 10:14:02
388
原创 两数之和力扣--1
给定一个整数数组nums和一个整数目标值target,请你在该数组中找出target的那整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。[0,1]因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。[1,2][0,1]
2025-01-12 19:08:34
394
原创 快乐数力扣--202
编写一个算法来判断一个数 n 是不是快乐数。「快乐数」 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1,那么这个数就是快乐数。如果 n 是 快乐数 就返回 true;不是,则返回 false。示例 1:输入:n = 19输出:true解释:示例 2:输入:n = 2输出:false。
2025-01-12 16:02:18
300
原创 两个数组的交集II力扣--350
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输入:nums1 = [1,2,2,1], nums2 = [2,2]主要用于对一个已有的数组进行截取复制,复制出一个左闭右开区间的数组。题目中说输出的顺序都可以,所以先把两个数组排序,然后两个指针。
2025-01-12 10:50:19
164
原创 两个数组的交集力扣--349
给定两个数组nums1和nums2,返回它们的 交集输出结果中的每个元素一定是的。我们可以。[2][9,4][4,9] 也是可通过的。
2025-01-11 16:42:13
367
原创 字母异位分组力扣--49
既然是字母异位,那么将他们排序后,应该是相同的,所以当且仅当两个字符串排序后一样,这两个字符串才能分到同一组。输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]接口提供的一个很方便的方法,它接收两个参数:第一个参数是要检查是否存在的键(在这里就是排序后的字符串,通过。输出: [["bat"],["nat","tan"],["ate","eat","tea"]]),这个实现的作用是当键不存在时,用来生成对应的值(也就是创建一个新的空的。
2025-01-06 10:18:06
628
原创 赎金信力扣--383(数组在哈希表中的应用)
ransomNote和magazine,判断ransomNote能不能由magazine里面的字符构成。如果可以,返回true;否则返回false。magazine中的每个字符只能在ransomNote中使用一次。falsefalsetrue(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。
2025-01-05 20:28:05
400
原创 有效字母异位词力扣--242
两个字符串中除了字母的顺序不一样以外,组成字符串的字母都一样。用两个for循环,可以暴力解出来,时间复杂度是O(n^2)相当于查找一个字母是否在集合中,自然想到哈希表。2.怎么想到要使用哈希表?,编写一个函数来判断。3.暴力解法可否解出来?
2025-01-05 20:12:52
336
原创 哈希表理论知识
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!
2025-01-05 17:20:27
769
原创 链表基础知识
/ 结点的值int val;// 下一个结点// 节点的构造函数(无参)// 节点的构造函数(有一个参数)// 节点的构造函数(有两个参数)
2024-11-05 10:35:24
312
1
原创 力扣904-水果成篮-两种思路
你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组fruits表示,其中fruits[i]是第i棵树上的水果。你想要尽可能多地收集水果。给你一个整数数组fruits,返回你可以收集的水果的数目。fruits = [3可以采摘全部 3 棵树。3可以采摘 [1,2,2] 这三棵树。如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。4可以采摘 [2,3,2,2] 这四棵树。如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。,3,3,4]5。
2024-11-01 08:59:22
808
原创 力扣209-长度最小的子数组-滑动窗口思想
给定一个含有n个正整数的数组和一个正整数target找出该数组中满足其总和大于等于target的长度最小的 子数组,并返回其长度如果不存在符合条件的子数组,返回0。2子数组[4,3]是该条件下的长度最小的子数组。10。
2024-10-23 20:09:11
232
原创 算法数组面试理论
数组的元素是不能删除的,只能覆盖。(因为内存地址是连续的,所以不能删除。或者可以这么理解:在一些编程语言中,静态数组的大小是固定的,一旦分配了空间,就不能动态地删除元素。要删除元素,通常需要创建一个新的数组,然后将不需要的元素排除在外,这实际上是一种覆盖操作。在Java中是没有指针的,同时也不对程序员暴露其元素的地址,寻址操作完全交给虚拟机。且用代码跑出来的结果是经过处理的,不是真正的地址,无法直接观察到是否连续。(所以在删除添加元素的时候需要移动其他的元素的地址)在C++中二维数组是连续分布的。
2024-10-09 18:52:41
342
原创 Redis基础知识
Redis是一个基于内存的key-value结构数据库基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻)企业应用广泛。
2024-08-08 10:04:09
984
原创 Maven高级
聚合是将多个模块组织成一个整体,同时进行项目的构建聚合工程是一个不具有业务功能的“空”工程(有且仅有一个pom文件)用来快速构建项目(无需根据依赖手动构建,直接在聚合工程上构建即可)
2024-07-29 17:38:06
368
原创 Springboot原理相关
在springboot中优先级application.properties>application.yml>application.yaml虽然支持多种格式配置文件,但是在项目开发中,推荐统一使用一种格式的配置(
2024-07-29 15:51:51
212
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人