自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 力扣47. 全排列 II

为什么是等于false时是树层去重,我们可以认为回溯操作时,我们有操作used[i]=false,回溯之后,回溯到了上一层,所以我们认为false的时候是树层去重。这道题和全排列那道很像,只是这道题有重复元素而已。有重复元素的话,我们就要先排序,把重复的给集中到一起。之后我们做出本题的树形结构,辅助解题。在本题当中树枝去重,树层去重都可以,我们选取树层去重,因为效率高。我们知道,我们为了去重还是需要used数组,去重的逻辑就是。

2024-09-18 19:06:21 283

原创 力扣46.全排列

由这个树形结构我们知道,以集合{1,2,3}举例,他的全排列的结果集里面会包含集合{1,3,2}还会包含{3,2,1},因此我们可以发现,在符合要求的结果里面,元素并不是有序的,1可以在3的后边,不必非得在3的前边,因此我们呢就不需要startindex这个变量了。而由于出于去重的需要,我们还需要使用used数组来辅助去重,初始化used都是false,如果当前的索引i对应的used[i]=true,很简单,直接跳过就行。排列问题也是属于回溯的解决范围。我们照常画出树形结构来辅助我们理解。

2024-09-18 18:52:53 291

原创 力扣90:子集Ⅱ

由于也是子集问题,每个节点都需要收集到结果集里边,而且由于是在同一个数组里边求集合,所以同样需要startindex来标识一下下一层递归从哪个元素开始递归。本题是力扣78的升级版,多了一个限制条件,就是集合里面会出现重复的元素,而且结果集里边不能有重复的子集,就比如集合{1,2,2}当中,返回的结果集可以包含集合{2,2}但是不能有两个{2,2}.因此我们需要考虑额外增加一个数组used,来记录这个元素是否被使用过,还需要用这个集合的元素来反映重复元素的去重情况。我们根据分析情况画出的树形图如下。

2024-09-18 17:04:16 370

原创 力扣78.子集

我们将使用回溯法的基本思想来解决子集问题,集合问题,排列问题,切割问题,棋盘问题。而回溯问题呢,都可以抽象成一个树形结构,我们在分析问题的时候,就需要画出相应的树形结构,最后判断收集结果的条件,以及符合条件的结果。回溯法的代码框架如下。我们可以知道,我们需要在每个节点都收集结果。而子集问题实际上和组合问题都很像,都是在一个集合上操作的,因此我们需要一个startindex来指示我们下一次递归开始的起始点。以本题为例,我们需要求一个集合元素互不相同的集合的子集。属于集合问题,我们就需要使用回溯算法。

2024-09-18 16:33:40 206

原创 404. 左叶子之和

思路:什么是左叶子节点,对于左叶子节点的父节点cur来说,cur->left!这样的话,cur->left就是左叶子节点。之后的话,就正常递归就行。

2024-09-11 20:46:03 164

原创 257. 二叉树的所有路径

本题想要得到路径的话,自然是自顶向下的,既然是自顶向下,那么就是先处理根节点,我们就应该使用前序遍历。我们要写一个遍历的函数,在遍历的时候存储下来我们的节点。递归的终止条件就是当前节点cur的cur->left==NULL&&cur->right==NULL。但由于本题的递归终止的特殊之处,我们在结束条件的上边就应该加入当前节点。之后处理左右孩子节点。

2024-09-11 20:16:47 221

原创 222. 完全二叉树的节点个数

思路:本题其实挺简单的,只需要用一个二叉树的层序遍历,挨个记录节点个数就行了。

2024-09-11 20:07:57 247

原创 力扣100. 相同的树

本题和力扣101实际上很像,只不过力扣101是判断对称,需要判断左节点的左孩子和右节点的右孩子的关系,以及左节点的右孩子和右节点的左孩子的关系。本题的话就是左节点的左孩子和右节点的左孩子的关系,以及左节点的右孩子和右节点的右孩子的关系。

2024-09-05 17:17:16 162

原创 力扣101. 对称二叉树

思路:我们来慢慢分析这道题,对于根节点1来说,他要判断他的左右孩子是否相同,相同的话继续进行,不同的话直接返回false。之后我们进入到2当中,要判断是否对称的话,我们就要判断左边2的左孩子和右边2的右孩子, 左边2的右孩子和右边2的左孩子这俩相等不相同。俩都相同的话才能返回1。我们接下来思考一下判断相等的函数,什么情况下才像等。要是左右都是空的话,肯定相等,左右有一个是空,另一个不是空的话,肯定不相等。要是俩都不是空,且俩值还不一样,那么也不想等。要是这俩的值相等,我们也不能下结论对称,还得看他的孩子。

2024-09-05 17:07:15 175

原创 力扣226. 翻转二叉树

思路:这道题的思路很直白,就是直来直去的,就是反转每个节点的左右孩子节点。我们采用递归的解决方法。

2024-09-05 16:56:20 278

原创 力扣111. 二叉树的最小深度

思路:这道题只是需要一个特殊的跳出条件,就是一个节点的左右孩子如果都是空的话,实际上就已经符合要求了,我们就应该立即跳出,结束程序,知道了这个之后就好办了。这道题和那个最大深度有相似之处,可以放到一起学习。

2024-09-04 22:07:08 249 3

原创 力扣104. 二叉树的最大深度

思路:所谓二叉树的最大深度,实际上就是利用了层次遍历当中的那两个while循环,第一个循环时while(!que.empty()),第二个是while(size--),实际上每一个while(size--)循环执行完一次后,都代表着一层的结束,我们就可以在这个while循环下边让depth变量++,最后返回depth即可。这道题很有意思,我们可以使用层序遍历通过一个队列来求解,也可以使用前序遍历等深度优先思想的遍历来求解。我先给出一个层序遍历求解的。

2024-09-04 22:03:20 309 2

原创 力扣116与117. 填充每个节点的下一个右侧节点指针/II

思路:这道题就是说,对于每个树的节点,我们都增加了一个属性就是next,初始时,每个节点的next都是NULL。我们还知道,next指向的是当前节点的右边节点。以本题为例,4的next就是5,5的next就是6,6是7,7是NULL。那么我们发现了规律,对于每一个在队列当中的节点,只要他不是每一层的末尾节点,那么他的next总是指向他的队列当中下一个的元素。但是我在作答116的时候并没有考虑到116这道题的特殊性,也就是完美二叉树。我考虑的是117的情况,所以我的116和117的代码是一样的。

2024-09-04 21:59:07 229

原创 力扣515.在每个树行中找最大值

思路:没啥大的改变,主要还是根据二叉树的层序遍历得到那个二维数组之后,将二维数组当中的每一维中的最大值找出来并放到一个数组当中即可。

2024-09-04 21:49:35 258

原创 力扣429. N 叉树的层序遍历

思路:没啥好说的,考察的还是二叉树的层序遍历,这道题只需要注意一下节点的孩子数组的大小就行了,没啥难度。二叉树层序遍历不会的先看这篇文章。

2024-09-04 21:46:47 276

原创 力扣637. 二叉树的层平均值

思路:没啥好说的,还是套用层序遍历的模板就行,在那二维数组当中的每一个一维数组当中算一下平均值就好了,没什么难度,主要考察的还是二叉树的层序遍历。

2024-09-04 21:44:04 341

原创 力扣199.二叉树的右视图,层序遍历解决

思路:我们需要返回这样的一个一维数组,我们就需要搞清楚每个数组元素在二叉树的层序遍历当中都有着什么的共性。通过观察我们不难发现,数组当中的每个元素都是当前层的最后一个,这有一个什么性质呢,就是此时的size=0,那么通过这个我们就在层序遍历当中加一行代码就可以了。层序遍历不会的话,建议一下先看这篇文章。

2024-09-04 21:40:24 392

原创 力扣107二叉树的层次遍历Ⅱ

思路:这道题的主题还是二叉树的层次遍历,层序遍历完了之后,我们可以将原先这次层序遍历得到的二维数组用一个一维数组的栈来储存,之后我们再根据栈的先进后出的特性,一步一步的出栈就行了,并将出栈得到的一维数组一次赋值给我们的目标二维数组ret即可。下面给出的是正常层序遍历的博客链接,如果正常的层次遍历还不会的话,建议先看完正常的层次遍历再来看本题。

2024-09-04 21:35:46 219

原创 力扣102 二叉树的层序遍历

之后我们就开始循环,循环结束条件就是root为空,以上图举例子,我们把根节点3放进去之后,进行一次循环之后,,我们想让队列里边只剩下他的孩子节点就是9,20,而ret数组里面要有第一层的3。第二次循环的时候,按照层序遍历的顺序,应该在一个小循环里面循环两次,因为第二层有两个元素9和20.小循环里面先让队列首段出队,如果之前队列首端的左孩子不为空的话,队尾加左孩子,右孩子不为空加右孩子,小循环结束后,我们要将第二层的9和20放到ret当中。就这样一直循环,直到队列变空。

2024-09-04 18:45:06 253 3

原创 力扣94二叉树的中序遍历。递归遍历的代码和非递归遍历的代码都有

我们一起来看啊,二叉树的中序遍历顺序是左中右,对应的这个二叉树的话,具体的中序遍历序列是 14256。也就是在当前节点为空的情况下,我们先改变一下cur,让cur=st.top(),然后弹出栈顶元素,并将原来的栈顶元素放到ret数组里边,并更新cur=cur->right.接着我们刚才举得例子,当前节点是1的左孩子为空,那么就先改变cur=st.top(),也就是cur重新变成了1节点,然会弹栈,栈顶元素是1,1就被放到了ret当中,之后cur就变成了1的右孩子,还是空,重复进行操作之后4被放到了栈里边。

2024-09-04 17:12:13 252

原创 力扣145,二叉树的后序遍历,包含递归遍历和非递归遍历

后序遍历的话和前序遍历都是很像的,我之前写过一篇前序的文章,在这里我就不赘述思路了,直接上代码了。这个下边是非递归的代码。

2024-09-04 16:43:34 323

原创 力扣144 二叉树的前序遍历,包含递归遍历和非递归遍历

我们创造一个栈st来辅助我们解决问题,我们先将根节点放入栈st当中,然后我们如果要想得到前序遍历的序列的话,自然是一个中左右的顺序,那么我们就需要先取出当前栈顶元素cur,也就是5,并放到ret数组里边。这道题其实就是一道非常基础而且典型的二叉树遍历的题目,对于二叉树的遍历我们有两种遍历方法,一种就是递归的遍历,还有一种就是非递归,用循环遍历。递归遍历的思路:这个其实就是一个老生常谈的问题了,没什么好说的,就是看当前节点cur是不是空,是的话就直接return,不是的话就依次递归的遍历其左右子树。

2024-09-04 16:33:57 349

原创 力扣383赎金信

思路:这道题是一个更为典型的哈希法,就是判断一个单词里的字母是不是在另外一个单词里面出现过。鉴于字母的个数有限,只有26个字母。我们采用数组作为我们的哈希表。我们初始化我们的hash[26]={0};用单词一来对哈希表初始化,hash[s1[i]-'a']++;用单词二来检验哈希表,在本题当中需要注意,单词一和单词二中都出现过的字母才会在单词二的过程中检验哈希表,也就是hash[s2[i]-'a']--;但是只出现过在单词二的单词就不用检验哈希表了。这点考虑到之后就没有问题了。

2024-09-03 21:23:32 281

原创 力扣202 快乐数

哈希法

2024-09-03 21:18:27 247

原创 力扣28 KMP算法找出字符串中第一个匹配项的下标

我们用一个for循环来遍历文本串,循环变量是i,循环里边,我们用一个j来代表模式串的下标,要是haystack[i]!在之后,我们在检查j的大小,要是j的大小等于needle的长度的话,就说明找到了这样一个符合要求的子串,我们就应该返回一个下标了,这个下标就应该是i-j+1。但是这样就不是这道题所要考察的地方,这道题想要考察的地方是KMP算法,KMP算法相较于暴力算法,它拥有更低的时间复杂度,他的时间复杂度是O(m+n),空间复杂度是O(m),因为需要额外申请一个next数组,存放最长相同前后缀的长度。

2024-09-03 17:59:20 504

原创 力扣541反转字符串II

暴力解法的思考过程:我们要返回一个字符串ret,ret初始化为空。再判断总共有多少个2k长度的字符串,就是s.size()/2/k,然后用变量i遍历这些字符串,然后对于第i个长度为2k的字符串,用substr函数取出其前k个长度的子串,存到临时的变量temp当中temp=s.substr(i*2*k,k),然后利用reverse函数反转一下temp,之后将temp加到ret上,再取出后k个字符串,不用反转直接加到ret上。对于剩下的长度不够2k的串,分情况,要是小于等于k,就直接反转,再加到ret上即可。

2024-09-02 21:27:16 258

原创 力扣349,两个数组的交集

思路:这道题利用哈希表即可解决,因为他要看nums1里面的元素是否在nums2里面出现过,那么我们常说,判断元素是否在集合里面出现过,用的都是哈希表。考虑到这道题主要看的是数字出现过没有,不能用数组,用unordered_set ,不用set的原因是因为集合里面可以有重复的元素,那么就不能用set。我们先构造哈希表并用nums1初始化,unordered_set<int> hash(nums1.begin(),nums1.end());存在的话就直接放到ret当中,自动过滤重复的元素。

2024-09-02 15:29:28 225

原创 力扣59 螺旋矩阵II

一个内圈是9,当n=4时,我们手写一下就知道,还是两圈,外圈是1,2,3,4,5,6,7,8,9 ,10,11,12,内圈是,13,14,15,16.当n=5时,就是三圈,n=6还是三圈。那么外层循环的循环次数就是n/2次。2*(n-1-i*2)<=j<3*(n-1-i*2),填写的就是5,6那部分,那么ret[n-1-i][3*(n-1-i*2)-j+i]=k;n-1-i*2<=j<2*(n-1-i*2)填写的就是3,4那部分,那么ret[i+j-(n-1-i*2)][n-1-i]=k;

2024-09-02 15:17:39 293 2

原创 UNITY无法创建项目的两个解决方法

你可以换一个编辑器版本,换成一个LTS的版本的编辑器,因为LTS版的编辑器更加稳定。我就是这样创建成功的。最近也是打算学习一下unity,可是下载后无法创建新项目,最后我也是误打误撞的解决了问题,给。你可以注意一下你的编辑器版本,就是下面那张截图中中间最上方的编辑器版本。就是取消勾选之后还无法创建新项目的话,就是类似于下面这种情况。方法一:把勾选的这个版本管理给取消了。大家分享一下我的解决办法。

2024-01-30 17:40:57 5453 2

原创 谭浩强C语言第九章知识总结

结构体属于用户自定义的变量类型,给予了我们更大的操作空间,便于我们解决问题

2023-01-05 16:22:42 1142 1

原创 谭浩强C语言第八章知识总结

指针是C语言的灵魂,指针可以在某些方面帮助我们高效完成一些工作

2023-01-05 16:19:58 2036

原创 谭浩强C语言第七章知识总结

第七章介绍了函数,建议在学习过第七章的知识后,我们再写代码时也要多用函数,因为函数实现了结构化的程序设计,便于日后的维护和优化

2023-01-05 16:17:42 577

原创 谭浩强C语言第六章

第六章介绍了数组,一维数组,二维数组以及字符数组和处理字符数组的一些函数

2023-01-05 16:14:18 157

原创 谭浩强C语言第四章第五章知识总结

主要是循环和选择结构

2023-01-05 16:11:46 175

原创 谭浩强C语言知识总结第三章

谭浩强C语言第三章

2023-01-05 16:09:30 433 1

空空如也

空空如也

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

TA关注的人

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