自定义博客皮肤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)
  • 收藏
  • 关注

原创 子集II(力扣90)

其中可能包含重复元素,请你返回该数组所有可能的。解题思路:used判断是否出现过,然后遍历就好了。返回的解集中,子集可以按。

2024-05-06 16:54:23 474

原创 子集(力扣78)

解题思路:把每一个遍历过的节点都收集下来就可以了。返回该数组所有可能的。

2024-05-06 16:49:44 190

原创 还原IP地址(力扣93)

和分割回文数大致一样,都是在叶子节点收集结果,不过这里要多定义一个用来判断是否合格的函数,并且收集规则是插入完三个节点后再判断收集,同时注意每次开始时要在两位之后因为插入了.if (s[i] > '9' || s[i] < '0') { // 遇到非数字字符不合。if (num > 255) { // 如果大于255了不合法。,用以表示一个 IP 地址,返回所有可能的。正好由四个整数(每个整数位于。之间组成,且不能含有前导。给定一个只包含数字的字符串。,这些地址可以通过在。

2024-05-06 16:44:07 661

原创 分割回文串(力扣131)

else { // 不是回文,跳过。if (isPalindrome(s, startIndex, i)) { // 是回文子串。// 寻找i+1为起始位置的子串。// 回溯过程,弹出本次已经添加的子串。解题思路:仍就是上递归三部曲,但于此同时要明白此时的index就可以作为切割回文串的线了。// 获取[startIndex,i]在s中的子串。// 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了。// 放已经回文的子串。

2024-05-04 20:36:51 475

原创 组合总和2(力扣40)

解题思路:因为这里不能有重复的组合,所以采取用下表used来判断其是否在前面出现过,如果出现过就直接跳过,同时判断是树层重复还是树枝重复,如果是树枝重复就不用跳过。中的每个数字在每个组合中只能使用。给定一个候选人编号的集合。解集不能包含重复的组合。中所有可以使数字和为。

2024-05-04 20:31:22 650

原创 力扣39(组合总和)

解题思路:没有什么特殊的,按照递归三部曲确定返回值与参数,确定终止条件,确定单层循环的逻辑就可以解出来。2 和 3 可以形成一组候选,2 + 2 + 3 = 7。注意 2 可以使用多次。如果至少一个数字的被选数量不同,则两种组合是不同的。7 也是一个候选, 7 = 7。,并以列表形式返回。中可以使数字和为目标数。对于给定的输入,保证和为。

2024-05-04 20:27:42 582

原创 删除二叉搜索树的节点(450)

但有一个孩子的时候直接返回孩子的地址,让当前节点的父节点直接指向孩子节点就好,然后释放当前节点,如果有左右孩子的话就要选择把其中一方连接到另一子数的下面。1,在叶子节点位置删除 2,在有左孩子没右孩子时的删除 3,在有右孩子没有左孩子时候的删除 4没有找到 5左右孩子都有时候的删除。一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。另一个正确答案是 [5,2,6,null,4,null,7]。

2024-04-25 16:35:35 777

原创 二叉搜索树中的插入操作(力扣450)

解题思路:因为是二叉搜索树,所以肯定有一个位置的叶子节点可以直接插入,我们只需要递归遍历找到位置罢了。确认终止条件:遍历到空时停止,同时创建新节点,返回新节点,让下一个节点接着。,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。,新值和原始二叉搜索树中的任意节点值都不同。给定二叉搜索树(BST)的根节点。

2024-04-25 16:29:26 387

原创 二叉搜索树最近的公共先祖(力扣235)

中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(解题思路:第一是直接按二叉树的最近公共先祖来做,第二是利用二叉搜索树的特性,从上到下遍历。如果大了就遍历左边,如果小了就遍历右边。例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。, 因为根据定义最近公共祖先节点可以为节点本身。

2024-04-25 16:18:11 356

原创 二叉树的最近公共祖先(力扣236)

解题思路:想法当然是从下往上记,如果碰到了就返回,那么很明显就要用后序遍历来做,递归三部曲:确定函数返回值已经参数,确定终止条件,确定单层递归的逻辑。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(if(root==p||root==q)return root;给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

2024-04-24 20:54:12 222 3

原创 二叉搜索树的众数(力扣501)

解题思路如下:直接暴力的算法就是遍历一遍树然后用map记录,最后再对map里的频率进行排序。但是这颗树是二叉搜索树,所以我们要利用好特性,在中序遍历的同时,设置变了count和maxTime来记录下出现的次数,其中当count大于maxTime时就可以动态改变最大值,而当相等时就把该数弹进容器里。}//是空的话说明cur遍历到叶子了。给你一个含重复值的二叉搜索树(BST)的根节点。,找出并返回 BST 中的所有。(即,出现频率最高的元素)。

2024-04-24 20:49:56 562

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

解题思路:因为二叉树是二叉搜索树,所以我们可以得知差最小的数一定是它相邻的数,所以我们可以采用中序遍历把每个元素都放进vector中再进行相减比较,但是这样就会消耗额外的空间,所以我们可以采取我们的老朋友双指针来做。让一个pre指针指向cur上一次指向的位置然后相减再和最小值比较,在中序遍历处。差值是一个正数,其数值等于两值之差的绝对值。给你一个二叉搜索树的根节点。

2024-04-24 20:43:06 192

原创 验证二叉搜索树(98)

解题思路:可以直接中序遍历放进一个数组里根据特性判断是否是递增就可以,如果采用递归的思路话用中序遍历和创建一个指针指向前一个节点,根据前一个节点是否比上一个节点小来判断是否是二叉树。根节点的值是 5 ,但是右子节点的值是 4。,判断其是否是一个有效的二叉搜索树。给你一个二叉树的根节点。

2024-04-22 21:10:14 259

原创 二叉搜索树中的搜索(力扣700)

解题思路:因为二叉搜索树的左小右大特点,中只是寻找比较目标,怎么序遍历都可以,终止条件就是遍历完毕和找到了,然后就遍历左右子树开始寻找就好了。返回以该节点为根的子树。如果节点不存在,则返回。你需要在 BST 中找到节点值等于。给定二叉搜索树(BST)的根节点。

2024-04-22 21:06:29 496

原创 合并二叉树(力扣617)

解题思路:实现两个二叉树同时递归遍历,遇到一方为空时就把另一方不为空的相同位置返回,所以这里特殊的是停止递归条件隐藏在上面,如果返回的是空值时自然不法继续进行(前提条件,前序遍历和在第一个二叉树上面构造最新的一颗二叉树)想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。

2024-04-22 21:02:48 296

原创 最大二叉树(力扣654)

[3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1]。- [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 []。- 只有一个元素,所以子节点是一个值为 1 的节点。- 只有一个元素,所以子节点是一个值为 0 的节点。- 空数组,无子节点。- 空数组,无子节点。

2024-04-22 20:58:17 1321

原创 从中序后序构造二叉树(力扣106)

这题我也不太会敲,暂时只懂个思路。

2024-04-21 11:34:38 78

原创 路径总和(力扣112)

if(root->right){//向右遍历。if(root->left){//先左遍历。不存在 sum = 5 的根节点到叶子节点的路径。由于树是空的,所以不存在根节点到叶子节点的路径。等于目标和的根节点到叶节点路径如上图所示。

2024-04-21 11:32:57 385

原创 513.找树左下角的值

解题思路:用层序遍历。从右遍历到左最好一个肯定是。假设二叉树中至少有一个节点。

2024-04-21 11:29:32 232

原创 左叶子之和(力扣404)

解题思路:用后序遍历找左孩子,需要注意的是左叶子需要通过其父节点来判断其是不是左叶子。在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。,返回所有左叶子之和。

2024-04-21 11:27:43 329

原创 二叉树的所有路径(力扣257)

解题思路:因为求的是路径,从根节点开始,所以采用中序遍历。并且要记录下路径,我们还要额外采用一个临时存放一条路径的容器,当遍历完一条时放入result中,再遍历另一条,这里采用的就是回溯了。// 中,中为什么写在这里,因为最后一个节点也要加入到path中。if (cur->right) { // 右。if (cur->left) { // 左。// 这才到了叶子节点。,返回所有从根节点到叶子节点的路径。是指没有子节点的节点。

2024-04-21 11:22:04 509

原创 平衡二叉树(后序遍历,力扣110)

解题思路:采取后序遍历的好处是先遍历节点得到高度,然后再判断高度差是否大于一,如果是的话就返回-1,不是就返回两高度中较大的高度加一就是父节点的高度。给定一个二叉树,判断它是否是。

2024-04-20 09:38:58 615 2

原创 完全二叉树(力扣222)

的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。解题思路:第一种是直接全部都遍历一遍,第二种是用完全二叉树的特殊性,判断是不是满二叉树,来节省时间和空间复杂度。,求出该树的节点个数。

2024-04-18 17:57:07 358

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

解题思路如下:该题和最大深度类似,但有坑,就比如当左子树或右子树一方为空而其他一方不为空时,如果不特殊判断的话就会倒置返回0;最大深度求法可以看我主页中之前发的。具体代码实现:(图片来源代码随想录)

2024-04-18 17:53:39 222 2

原创 找到二叉树最大深度(力扣104)

解题思路:分别是用前序遍历和后序遍历,前序遍历就是正常的从上到下求深度,而后续遍历就是从下到上求高度,而高度和深度是互逆的,所以这里采用后续遍历,需要注意的是,最底层是从1开始的,所以遍历到底部时记录的高度时1+遍历。是指从根节点到最远叶子节点的最长路径上的节点数。

2024-04-18 17:49:36 416

原创 判断二叉树是否对称

解题思路:首先判断特殊情况,比如左右子树是否为一空一有,是否为两空,是否相等,然后递归判断外侧是否相等(即为左子树的左节点和右子树的右节点)和内侧是否相等(即为右子树的左节点和左子树的右节点)给你一个二叉树的根节点。, 检查它是否轴对称。

2024-04-17 20:44:10 235

原创 反转二叉树(力扣226)

解题思路:用队列进行前序遍历的同时把节点的左节点和右节点交换。

2024-04-17 20:39:13 559

原创 二叉树层序遍历

解题思路:因为二叉树本身不肯用来遍历,所以我们采取用队列来模拟二叉树的方法遍历二叉树,原理是把二叉树的节点放入队列中,并且设置size来控制每次的弹出,以此来分辨每次的输出到底是第几层的东西。具体代码如下:(图片来源,代码随想录)

2024-04-17 20:35:28 248

原创 二叉树递归遍历

2024-04-16 19:27:54 110

原创 优先级队列(力扣347,前k个高频元素)

大体思路:用map记录下来然后再快排,当然这样时间复杂度过高,我们也可以采用优先队列的方法。还没整懂pair那些基本的东西,这个补完知识点再弄。

2024-04-15 16:45:46 388

原创 滑动窗口最大值(力扣239)

解题思路:首先是用暴力循环来解,其次便是用队列来模拟这个滑动窗口,同时要自定义三个函数,一个pop用来弹出来保证滑动窗口的移动,同时我们把最大的放在队列口那里,当每次有更大的就把原来的挤出栈外,一个push用来把前面不够大的元素排挤出队列并且把最大的那个数压入队列,还有一个find来找到最大的元素。

2024-04-15 11:19:43 672

原创 删除字符串中两个相邻字符(力扣1047)

result.empty()) { // 将栈中元素放到result字符串汇总。// 此时字符串需要反转一下。解题思路:匹配的题用栈来做,这里用一个栈遍历支付串,遇到相同的就弹出去,最后再把栈转换成字符。在完成所有重复项删除操作后返回最终的字符串。在 S 上反复执行重复项删除操作,直到无法继续删除。会选择两个相邻且相同的字母,并删除它们。给出由小写字母组成的字符串。

2024-04-14 15:24:21 211

原创 有效括号,力扣20题

解题思路如下:利用栈,找到向左开的括号,然后把对应的右括号放入栈中,然后对遍历的号进行匹配,如果和栈顶的括号相同,则通过,不相同的话就直接退出,并且考虑到是一左一右,所以字符串的长度要是个偶数,不是的话就直接跳过,同时不符合条件一共有三种可能 1. 左括号多了,2 右括号多了,3 括号不匹配,if(s.size()%2!//判断长度是否为奇数,是的话就肯定错。,判断字符串是否有效。

2024-04-14 14:41:38 436

原创 用队列来模拟栈

解题思路:首先搞清楚栈和队列的区别,然后一个队列便可以模拟栈,因为先进先出的关系,所以只用把前面的重新加载一次那么输出的顺序就和栈一样了。

2024-04-14 13:27:09 250

原创 用栈来模拟队列

思路:首先栈是先进后出,队列是先进先出,所以用两个栈来模拟队列,一个用来进,一个用来出,用来进的再弹给用来出的便是队列的顺序了,具体代码如下。

2024-04-14 13:23:41 447

原创 KMP算法

小小的了解了一下,还是不是很懂,二刷的时候再来搞定它。

2024-04-12 15:07:30 324

原创 反转字符串中的单词(力扣151)

特别需要注意的是判断条件是fast<=s.size();去空格做法:运用快慢指针,判断快指针指向的是否为空,然后赋给慢指针的指向位置,但是因为单词与单词之间是有一个空格的,所以用慢指针来给赋值空格,并且因为首单词前面是没有空格的,所以对首单词要特殊判断。难点:该字符串中单词与单词之间有空格并且单词之前和之后也有空格,如果直接进行翻转操作会导致空格也被反转过去,所以要进行去空格。=' ')//但快指针不为空时。

2024-04-11 21:25:00 603

原创 反转字符串(力扣541)

解题思路:可以直接写一个reverse函数,也可以用系统的reverse,同时要注意反转的规则,因为每次到达2k时翻转,所以我们直接自增量设为2k,同时注意库函数通常都是。

2024-04-11 15:34:26 416

原创 力扣344反转字符串

解题思路:用双指针和一个临时变量temp。

2024-04-11 12:31:01 356 1

原创 力扣18题(四数之和)

解题思路:和三数之和是一样的运用双指针来移动,只不过多了一层for循环在三数之和的外面,同时要进行的减枝操作也有挺多而且很细节。

2024-04-10 19:30:45 395 1

空空如也

空空如也

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

TA关注的人

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