自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode455.分发饼干、376. 摆动序列、53. 最大子序和

这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。可以尝试使用贪心策略,先将饼干数组和小孩数组排序。为了满足更多的小孩,就不要造成饼干尺寸的浪费。

2024-06-05 22:07:36 408

原创 leetcode530. 二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值,二叉搜索树可是有序的遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。

2024-05-28 17:31:49 961

原创 leetcode654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索

构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。这表示一个数组大小是1的时候,构造了一个新的节点,并返回这里有三步工作这样我们就分析完了,整体代码如下:(详细注释)

2024-05-22 01:34:50 588

原创 leetcode513.找树左下角的值、112. 路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

然后是。

2024-05-19 23:24:40 783 1

原创 leetcode110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。这个回溯就有很大的问题,我们知道,回溯和递归是一一对应的,有一个递归,就要有一个回溯,这么写的话相当于把递归和回溯拆开了, 一个在花括号里,一个在花括号外。当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int。

2024-05-18 22:54:25 841

原创 leetcode 104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

相对于104.二叉树的最大深度 (opens new window),本题还可以使用层序遍历的方式来解决,思路是一样的。那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。本题依然是前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。

2024-05-14 21:16:16 713

原创 leetcode226.翻转二叉树、101.对称二叉树

我们之前介绍的都是各种方式遍历二叉树,这次要翻转了,感觉还是有点懵逼这得怎么翻转呢?如果要从整个树来看,翻转还真的挺复杂,整个树以中间分割线进行翻转,如图:可以发现想要翻转它,其实就把每一个节点的左右孩子交换一下就可以了那么层序遍历可以不可以呢?依然可以的!只要把每一个节点的左右孩子翻转一下的遍历方式都是可以的!

2024-05-14 17:46:55 738

原创 leetcode515.在每个树行中找最大值、116.填充每个节点的下一个右侧节点指针、117.填充每个节点的下一个右侧节点指、104.二叉树的最大深度针II、111.二叉树的最小深度

本题依然是层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了。这道题目说是二叉树,但116题目说是完整二叉树,其实没有任何差别,一样的代码一样的逻辑一样的味道。相对于 104.二叉树的最大深度 ,本题还也可以使用层序遍历的方式来解决,思路是一样的。至此,十道层序遍历的题都解决了,对于层序遍历应该也能闭着眼睛打出模板了!在层序遍历的过程中,记录一下遍历的层数就是二叉树的深度即可。思路很简单,层序遍历的时候顺便找出每层的最大值。

2024-05-14 16:41:10 306

原创 leetcode102.二叉树的层序遍历、107.二叉树的层次遍历 II、99.二叉树的右视图、637.二叉树的层平均值、429.N叉树的层序遍历

这道也不难,层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。先push根节点进入队列,记录后弹出,并push其左节点和右节点。相对于102.二叉树的层序遍历,就是最后把result数组反转一下就可以了。而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。需要借用一个辅助数据结构即队列来实现,队列先进先出,如果这道题理解了的话,本文中十道题都可以做了!把这十道题都掌握了,层序遍历就没问题啦。怎么样,以上五道题都不会很难对吧。

2024-05-14 16:23:39 251

原创 leetcode144. 二叉树的前序遍历、94 二叉树的中序遍历、145 二叉树的后序遍历

从深度优先遍历和广度优先遍历进一步拓展,才有如下遍历方式:在深度优先遍历中:有三个顺序,前中后序遍历,很容易搞混,这里有一个技巧:这里前中后,其实指的就是的遍历顺序,只要记住 前中后序指的就是的位置就可以了看如下中间节点的顺序,就可以发现,中间节点的顺序就是所谓的遍历方式前序遍历:中左右中序遍历:左中右后序遍历:左右中可以对着下图,看看自己理解的前后中序有没有问题:二叉树的遍历方式已经学会了,现在可以退出啦(bushi。

2024-05-09 01:29:01 698 1

原创 leetcode239.滑动窗口最大值、347.前 K 个高频元素

每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。:如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止。这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。:如果窗口移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作。

2024-05-07 19:02:41 581 1

原创 leetcode20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

遍历字符串,把字符一个一个放进栈中,如果要放进去的字符与栈顶相同,删除,最后再把栈里的字符取出来(记得翻转)解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。实际上,这个是算式 2 + 4 * ( 5 - 2 ) 的波兰表达式。输入:tokens = [“2”,“1”,“+”,“3”,“*”]我们也可以直接把结果字符串作为栈,这样还能省去翻转的操作。那我们分析的三种情况,分别对应栈的什么情况呢?首先了解一下波兰表达式:波兰表达式。,算完再放回去,最后弹出结果即可。

2024-04-30 23:04:09 174

原创 leetcode232. 用栈实现队列、225. 用队列实现栈

有的同学可能疑惑这种题目有什么实际工程意义,,以下两题便是如此首先,先牢记这是一道模拟题,不涉及到具体算法,考察的就是对栈和队列的掌握程度。使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈,这里要注意输入栈和输出栈的关系在push数据的时候,只要数据放进输入栈就好,但,再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了最后如何判断队列为空呢?,那么我们先说一说两个队列来实现栈的思路所以用栈实现队列, 和用队列实现栈的思路还是不一样的,这取决于这两个数据结构的性质。

2024-04-29 01:09:40 771

原创 leetcode344. 反转字符串、541. 反转字符串 II、54. 替换数字、151. 反转字符串中的单词

乍一看可能想不出来,但是解决方法其实很简单,通过整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符再分别倒叙一把,负负得正,这样就不影响子串里面字符的顺序了。再填充,用旧指针从原字符串最右边开始,用新指针从扩充后新长度右边开始。旧指针指向字母,新指针就复制;旧指针指向数字,新指针就填充。时间复杂度为O(n^2),因为earse函数的时间复杂度为O(n)时间复杂度O(n) ,空间复杂度O(1)时间复杂度O(n) ,空间复杂度O(1)先扩容,计算出替换后的字符串长度。时间复杂度: O(n)

2024-04-27 23:05:29 286

原创 leetcode454. 四数相加 II、383.赎金信、15.三数之和、18四数之和

本题只需找出符合题意的元组的个数,。先将A、B数组遍历相加,求出所有可能出现的值,并记录出现的次数;再将C、D数组遍历相加,求出所有可能出现的值,如果某个值等于0 -(a+b),记录其出现的次数时间复杂度:O(n^2),两个for循环空间复杂度:O(n^2),最坏的情况下,sums1和sums2中的值各不相同,相加产生的数字个数为n * n你是一个十恶不赦的绑匪,绑架了邻居玛丽阿姨刚出炉的苹果派,现在要制作一封赎金信,为了防止山姆大叔识别出你的字迹,再用他的拖鞋狠狠抽你的屁股,你决定从杂志。

2024-04-26 19:22:30 1667 1

原创 leetcode242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。本题中,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用 key value结构来存放,key来存元素,value来存下标,那么使用map正合适。,大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。

2024-04-24 17:15:01 954

原创 leetcode24. 两两交换链表中的节点、19. 删除链表的倒数第 N 个结点、面试题 02.07. 链表相交、142. 环形链表 II

使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理思路如下图时间复杂度O(n),空间复杂度O(1)刚开始的思路:扫描链表的长度len后,再删除第len-n个节点(需扫描两次)进阶:要求使用一趟扫描实现运用双指针,要删除倒数第n个节点,就让fast先移动n步,然后让fast和slow同时移动,直到fast指向链表末尾,删除slow所指向的节点即可时间复杂度O(n),空间复杂度O(1)第一个while循环也可以换成以下for循环。

2024-04-22 22:27:06 866

原创 leetcode203.移除链表元素、707.设计链表、206.反转链表

关键是初始化的地方, 可以看到双指针法中初始化 cur = head,pre = NULL,在递归法中可以从如下代码看出初始化的逻辑也是一样的,只不过写法变了。最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。递归法相对抽象一些,但是其实和双指针法是一样的逻辑,同样是当cur为空的时候循环结束,不断将cur指向pre的过程。首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为NULL。如果再定义一个新的链表,实现链表元素的反转,会产生内存空间的浪费。

2024-04-21 21:22:25 438 1

原创 leetcode59.螺旋矩阵II

每画一条边都要坚持一致的左闭右开(或者左开右闭)的原则,拐角处让给新的一条边来继续画。时间复杂度 O(n^2): 模拟遍历二维矩阵的时间。,取定区间为“左开右闭”空间复杂度 O(1)

2024-04-21 15:51:20 380 1

原创 leetcode977.有序数组的平方、209.长度最小的子数组

经历报错:while 循环处原本被我用了if循环从而导致报错,分析原因,应该在每次更新 i 后,不断比较子序列是否符合条件,用 if 只会比较一次。,平均时间复杂度为O(n*log n),是不稳定的排序。i指向数组左端,j指向数组右端,从两端向中间求。报错,分析得知j或者i减了两次,修改后如下。的过程中感受到了算法优化所带来的简洁。直接求平方后排序,使用到了c++时间复杂度为O(n^2),超时。

2024-04-19 01:29:57 366

原创 leetcode704.二分查找、27.移除元素

分析代码逻辑后,发现middle的定义放在while外,其值只会在循环开始之前计算一次,导致了时间超时。middle = (left + right) / 2可能会导致整数溢出。时间复杂度为O(n),空间复杂度为O(1),性能得到明显优化。该暴力解法的时间复杂度为O(n^2),空间复杂度为O(1)定义在while循环中,在每次迭代时重新计算。解决方式:将定义修改为。

2024-04-17 22:17:33 511 1

空空如也

空空如也

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

TA关注的人

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