自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 46.全排列

这道题目将数组中的数字进行全排列,与前面组合不同,前面组合是通过顺序来去除用过的数字(即startIndex,选过之后不会再选第二次,接着选后面的数字),变化的是不同数之间的组合。但全排列变化的是相同数之间的位置变换,因此每个位置的数(每层递归)都必须重新遍历整个数组,但需排除当前list已经包含的数字,需要使用一个used数组来记录。这样一来就可以理解为在每个位置上暴力选取整个数组的数字(不重复),来完成全排列。

2024-04-07 09:51:25 237

原创 78.子集&90.子集2

又回到了组合的模板中来,这道题相比于前面的题省去了递归终止条件。大差不差。

2024-03-28 18:26:52 234

原创 93.复原IP地址

按照昨天分割字符串的套路。点1:终止条件设为在遍历完整个串时发生,且这道题目需要考虑将分割的子串数,即ip地址为四段,因此需要两个共同条件:遍历整串+子串四段。若只达到其中一个而另一个不满足,则返回。点2:在for循环分割串时,正常分割从startIndex开始,母串尾结束,这道题需要额外考虑其他三个条件。1.子串长小于3 2.不能由0作为数字开端,0除外 3.子串大小介于0-255点3:利用StringBuilder构建串时,需要添加删除,删除最后一个网段。

2024-03-27 13:43:17 125

原创 131.分割回文串

前面回溯联系的都是组合,每次取一个字符出来进行拼接。回溯分割做法,难点在于什么情况下终止回溯。如何分割,每次怎么取。先解决第一个问题,按照题目意思,需要将s分割成多个回文串,那么终止条件则是找到了分割的办法,且所有子串为回文串。如何分割,按照回溯模板,在for循环中进行思考。不同于组合for循环的i下标用于每次取出一个字符用于当前位置的组合,在分割中i下标扮演着分割线的作用,负责将起始位置到i的字符分割出来。按照题目意思,分割出来的子串为回文串,那么添加,递归查找后续子串内的回文串分割方法;

2024-03-26 20:01:04 166

原创 39.组合总和&40组合总和2

还是按照组合回溯的思想来解,与原先组合区别就是集合内的元素可重复使用,刚开始考虑原先回溯中startIndex是为了避免重复,那么只需每层递归for循环都完全遍历集合中的元素即可。但结果出现了排列不同的结果,如[2,2,3],[2,3,2]的情况,于是还是要设置startIndex,要求当前元素作为起始元素时,可以再次使用自身,但无法使用前面已经遍历过的元素,因此startIndex可设为当前循环轮数,保证一个循环内的每层递归使用的集合范围不变。

2024-03-22 14:09:32 141

原创 17.电话号码的字母组合

本题也是组合的回溯操作,区别于前面两题,这题的回溯操作是在不同的集合内,因此需要考虑在每一层的递归时应该确定哪一个集合,那么在for循环的范围就可控制为这个数字对应的字母数量。此外,还需考虑digits映射问题,可以使用map或String数组来控制,事先在构建时加入。按照回溯模板,递归结束是按每次遍历完digits中的元素一次,即当前保存字符的temp大小等于digits的大小。

2024-03-21 13:03:12 104

原创 216.组合总和3

借助前面组合回溯的方法,可以套用到本题中,递归过程中一旦超出题目条件或达到题目要求即返回。对回溯的写法有了进一步理解,for循环控制的是当前递归层(组合位置)的值,而递归目的是找下一个层(组合位置)的数,传入的startIndex为确保不重复。

2024-03-20 15:52:42 202

原创 77.组合

无,按照代码随想录给出的模板,需要出现一个终止条件,以及for循环。终止条件负责收集结果及返回。for循环控制横向,循环内进行递归控制纵向。

2024-03-13 15:25:18 200

原创 538.把二叉搜索树转换为累加树

首先是想到迭代法,反中序遍历,右中左,依次遍历修改值。还有递归法,同样反中序遍历,递归修改每个节点的值。题解mrriors算法遍历看不懂。

2024-03-12 15:26:30 180

原创 108.将有序数组转换为二叉搜索树

既然是递增的有序数组,那么只需从中间开始向两边遍历建树即可。考虑到平衡二叉树,那么需每次确定中心节点,中心节点两边为左右子树。采用递归调用可以解决。写了代码一直报错,查看题解发现代码长得差不多,不知道哪里出了问题。可能是数组边界没处理好。

2024-03-12 13:02:35 176

原创 669.修剪二叉搜索树

这个题也可以算作对二叉搜索树整体操作的一类题,这类题的普遍解法是通过递归+可能出现的不同情况分析进行解题。本题也是一样,考虑root是不是在边界内,还是在边界两边(两种情况)。

2024-03-12 12:57:24 178

原创 450.删除二叉搜索树中的节点

对于普通情况下的节点删除便于理解,但对于存在子树的节点不太能理解。根据题解,将要删除的节点进行分类,分成4类(没找到除外),关于是否存在子树及左右情况。最后一种情况,即左右子树均存在,解决办法是找到右子树最左节点,将左子树挂在这个节点上。代码整体使用递归方法时,一开始在想怎么达到删除操作的目的,递归的返回值应该是什么。题解直接将返回值赋值给root的左右子树,以此来达到删除的操作。这种最后要返还整棵树的题目递归解法,返回值设定大都参考此类(同前一道题目701插入操作)。

2024-03-11 10:21:43 311

原创 701.二叉搜索树中的插入操作

受前面两题影响,上来直接中序遍历搜索二叉树,利用pre记录前置节点,若出现val大小合适位置,则将val插入。后来想到更简单的方法,根据二叉树特性直接递归找到合适的插入节点即可。

2024-03-11 09:37:17 221

原创 236.二叉搜索树的公共祖先

看到题想的是找到两个点的各自路径利用stack保存,根据路径长度大小将两个stack的值对齐到同一层,之后同时出栈节点,若相同则找到祖先节点。但是效率不高看了大佬代码,递归思想很难理解。根据大佬代码思想写了一个便于理解的版本,分为四种情况,递归求解。

2024-03-07 21:02:34 199

原创 501.二叉搜索树的众数

第一眼,中序遍历+哈希表找最大出现次数解题,暴力解法。需要中序遍历一遍+哈希表取最大值一遍+哈希表根据最大值找对应键一遍。复杂度3n。后续,可根据二叉搜索树性质来解,在中序遍历时对前后两个相邻的节点值进行判断,若为一样则累加当前节点值的数量,与众数比较大小,判断是否替换将当前值入List。将List转为int[]数组。

2024-03-07 18:56:37 128

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

看到题目想到用递归,因为是二叉搜索树,所以就是比较邻近节点之间的值并记录最小值,所以采用递归方法中序遍历,唯一考虑的点是需设置一个全局节点来保存前一个节点,解决叶子节点计算值的问题。同样中序遍历还可以采用迭代法,代码这里重新练习一下。

2024-02-29 12:54:38 194

原创 98.验证二叉搜索树

1.一开始使用递归,想当前节点满足条件后,再使左右子树分别满足条件。失败,只考虑了节点与左右子树的大小,未考虑隔代节点的关系。2.转变思路,使用中序遍历的方法,从第一个节点开始,若出现当前节点小于前一个节点值,则不满足。测试用例出现一个较大的值。看题解,题解也是这两种解法,递归解法额外添加了两个指针用于限定值得范围,递归左子树变上限为父节点的值,下限不变;右子树下限为父节点的值,上限不变。这样就解决了深层的子树值无法与上层节点比较的缺陷。如(5,3,7,1,6)。

2024-02-28 19:18:56 187

原创 01.19

应该使用两个队列来进行层序遍历也比较简单,代码稍微麻烦一些,要多增加几个判断语句。简单的递归,判断两个节点分别为空的情况即可,这里将1树构造为最终结果。二叉搜索树常规解法,while循环来迭代进行root的查找操作。

2024-01-19 10:30:07 377

原创 01.18

做完昨天的中序及后序遍历构建二叉树,做今天这个题目就有些类似的感觉,同样使用双指针来控制nums中的数值变动即可。构建递归函数,每次找出最大的值,然后找出其下标(一开始像昨天一样使用hashmap,后来发现每次都要循环来找最大值,可以顺便找其下标,可以不用hashmap),递归其左右两子树。

2024-01-18 13:19:51 355

原创 01.17

按照上述思路,写出来代码,很是辣鸡。题解的递归方法十分巧妙,确定好后序序列的值后(后序序列最后一个值,每次递归往前推一位,所以后序序列不断缩小,因为是后序遍历,从后往前是“中右左”,所以它的值最前面的为左树的值,因此优先遍历右子树,不断向左子树遍历,),传入的是子树的头尾两个指针(中序序列首尾指针),根据指针来保存一个子树的所有节点值。迭代看不懂。

2024-01-17 20:19:22 577

原创 01.16

递归函数什么时候需要返回值?什么时候不需要返回值?如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。(这种情况就是本文下半部分介绍的113.路径总和ii)如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。(这种情况我们在236. 二叉树的最近公共祖先 (opens new window)中介绍)如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。(本题的情况)

2024-01-16 10:12:13 343

原创 01.12

1.层序遍历做这题比较好做,定义一个变量值为根节点值,后续每循环一层,将值更改为队列的peek值。最后输出。2.还有一种深搜递归,设置两个全局变量,一个用于记录当前的值,一个用于记录该值在树的层数。深搜遍历采用前序遍历,若深度大于该值,则替换,这样一来会记录深度最大的值,由于采用前序遍历,第一个深度最大的值一定为最左边的值,后续深度相同的值无法替换。

2024-01-12 10:39:28 394

原创 01.11

两种都是基于深搜递归1.递归查找每个节点满足左子树不为空且左子树为叶子节点的值(),若满足条件,则将值加入sum中。2.递归查找每个节点的左子树为叶子节点的值,比较于第一种方法,直接使用boolean参数来判断是否是左节点,将满足条件的值返回。3.层序遍历也可以做,在出队的每个节点加入方法1中的判断,若满足加入sum即可。

2024-01-11 14:43:56 337

原创 01.10

与昨天做的题目有些类似,都是递归然后自底向上进行回溯,需要好好理解这个思想。

2024-01-10 13:07:11 551

原创 01.09

1.直接能够想出来是通过求左右两颗子树的深度,相减后来判断当前节点是否是平衡的,再递归其左右子树。时间复杂度O(NlogN)。2.题解利用了后序遍历+剪枝(从底至顶),按照后序遍历节点的顺序,依次判断是否是平衡,并记录该节点的深度递归返还给上一层节点.利用-1来记录非平衡。时间复杂度为O(N)。这个方法很难想到(自底向上),想到了又很难写出来(递归的终止条件)。

2024-01-09 10:07:07 351

原创 01.08

前两个解法比较简单,容易想到,三个不容易想到,利用了满二叉树的性质。

2024-01-08 11:26:10 326

原创 01.05

比较简单。

2024-01-05 13:21:36 416

原创 01.04

递归解法,递归需要考虑一个节点下两个子节点的关系,左节点next指向右节点,因为是完美二叉树,因此只需判断右节点是否存在,之后再判断根节点是否存在next,是的其右节点能够指向next的左节点。之后递归左子节点与右子节点。

2024-01-04 13:09:27 321

原创 1.2+1.3

层次遍历解法:1.利用队列完成二叉树层序遍历2.需要利用size来记录下一层节点的个数3.内循环使用List来保存节点值,最后存入List上述题目用层次遍历解普遍属于简单难度,部分题目可以使用递归解法,如116.117.104.111.明天尝试对这四道题目进行递归解法。

2024-01-03 13:20:00 353

原创 12.29

总体思路是通过栈的入栈出栈顺序来控制输出结果,也是用栈来模拟递归。如前序遍历,中左右,则根节点,入栈后立即出栈,加入右左两节点。左节点成为下一个根节点。中序遍历,比较麻烦,左中右,则事先根节点入栈,并不断向左节点探寻,直到叶子节点,然后按顺序出栈中的根节点,每出一个,则继续探寻其右节点是否存在,把右节点当做根节点继续向其左节点探寻。后序遍历,左右中,事先按照前序遍历的方法反转遍历中右左,时候进行反转。中序比较麻烦,可以多理解理解。但是这样迭代中序跟其他两种不一样,写的时候比较麻烦。

2023-12-29 16:04:51 337

原创 12.28

简单熟悉了下语法。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

2023-12-28 12:59:11 614

原创 12.27

重温了堆排序的思想(但题解普遍没有写堆排序的代码),以及Java中的优先队列优先队列(PriorityQueue)是一种特殊类型的队列,它能够根据元素的优先级自动进行排序。在优先队列中,元素被赋予一个优先级,具有高优先级的元素会被先出队列。优先队列使用了堆数据结构来实现,在添加和删除元素时能够保持队列的有序性。可以自己设置比较器,比较器优先级设置,大于0交换,o1[1] - o2[1]即从小到大排,队列优先出小。

2023-12-27 15:02:17 336

原创 12.26

重点在于找队列中最大值,及控制每个元素的出队情况。队列中的size不一定要等于滑动窗口大小。只需保留最大值在队首,以及其后小于其的值。如此队列就是递减队列。其中一个重要的点是判断队列最大值的出队时间,如果size等于滑动窗口大小,则可判断。当size小于滑动窗口大小时,需要判断nums[i-k]的值是否为队首的最大值,代表k个循环前入队,可以出队了。这道题主要在于找队列的最大值,使用单调及双端队列来解答。

2023-12-26 12:29:33 335

原创 12.25

无。

2023-12-25 11:14:11 352

原创 12.24

写的时候采用了栈的方法,比较方便。双端队列同理。

2023-12-24 13:37:58 338

原创 12.21

括号对应的情况可以使用map。

2023-12-21 12:19:37 355

原创 12.20

写代码的时候把Deque双端队列及Qeque单向队列搞混淆了。qeque的存取操作分别为offer及poll。而deque的存取操作为push及pop。Queue的实现类有很多(如LinkedListArrayDeque。

2023-12-20 19:43:03 366

原创 12.19

学习栈和队列的基础知识。

2023-12-19 10:15:50 373

原创 12.15

暴力解法,KMP解法(利用next数组的值求解),字符串拼接移位解法。

2023-12-18 10:02:57 14

原创 12.15

题解给出了也是普通集KMP两种解法。

2023-12-15 12:33:51 13

空空如也

空空如也

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

TA关注的人

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