![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
每日一题
文章平均质量分 83
阿熊不会编程
准大三,阿里云专家博主,支付宝开发者社区优秀季度创作者,主攻C/C++方向。道虽小,不行不至,事虽小,不为不成。
展开
-
LeetCode-1004. 最大连续1的个数 III
这题是一个很经典的滑动窗口的问题,结合我们之前做的滑动窗口的问题来看,滑动窗口出现的场景通常需要枚举数组所有情况,也就是暴力,然后我们在暴力的基础上进行优化。原创 2024-03-10 00:01:03 · 1204 阅读 · 6 评论 -
合并有序链&&反转链表(递归版)
递归逻辑三步走,首先看时候能拆分成重复子问题,再看如何执行递归,最后别忘记结束递归的边界条件!虽然题目很简单,但是以递归的方式解决还是可以很好的锻炼我们的递归逻辑思维的,总得要一步一个脚印,慢慢的啃下这块硬骨头。原创 2024-03-06 12:33:08 · 1007 阅读 · 10 评论 -
每日一题:LeetCode-LCR 007. 三数之和
💪💪当然切记不可😈走火入魔😈,每日打怪,拾取经验,终能成圣🙏🙏!我们还可以在暴力的基础上使用双指针解法,我们首先定住一个值,然后使用双指针来标记另外两个值,定住的值不动,双指针遍历剩下的数组元素,找出所有正确的三元组,尾插进二维数组里,数组遍历完,定值再向右遍历,双指针重置。【1】当固定值不变的时候,左指针的的下一个位置的值和上一个位置的值相等,再次进行比较,就是一个新的三元组,但是这个三元组的值和上一个三元组的值就重复了,不仅左指针如此,右指针也是如此,所以需要将左右指针指向和上一个值不同的值。原创 2024-01-12 12:51:40 · 2033 阅读 · 26 评论 -
每日一题:LeetCode-LCR 179. 查找总价格为目标值的两个商品
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!而要与target值进行比较,这里有三种情况,一种是大于target值,一种是小于target值,最后就是等于target值。其实经过前面这些题的练习,这题的双指针是很容易就想到的,左右位置的值相加进行比较,再做出对应的行为。,当左右指针指向的值相加小于target值,左指针就自增,向后移动,因为是一个升序数组,所以。原创 2023-12-28 23:44:48 · 736 阅读 · 11 评论 -
每日一题:LeetCode-LCR 016. 无重复字符的最长子串
这题使用双指针暴力写法也不是很简单,尤其是在右指针回退那里,一不小心就容易出错,而我们使用滑动窗口来解决问题,虽然代码量很少,但是却很不好想,滑动双指针的题做多了可能你觉得滑动双指针不难,可是我认为,我们能想到这题使用滑动双指针更加重要。3、左指针移动之后,我们就与上一次记录的不重复子串进行比较,返回较大值。原创 2023-12-18 22:40:57 · 915 阅读 · 15 评论 -
每日一题:LeetCode-611. 有效三角形的个数
9这个位置的值已经枚举完了,那么我们将right指针向左走一步,重复上述步骤,但是如果当nums[left]+nums[right]<nums[nums.size()-1]时,我们就要移动左指针了,如果当两指针相遇时还没有大于比较值的数,那么左边的情况也不需要再枚举了,因为递增数组1,最大的两个数相加都没有大于比较值,更何况比他们要小的值,所以当两指针相遇时,以当前比较值为基准的情况已经全部枚举完成。还是太高了,我们可以想办法优化一下,三层for循环时间复杂度过高,那还有什么方法能够再优化一下呢?原创 2023-12-17 10:15:56 · 417 阅读 · 10 评论 -
每日一题:LeetCode-11.盛水最多的容器
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!开启我们今天的斩妖之旅吧!但是我们的暴力解法时间复杂度是比较高的,对于这题来说,暴力解法应该是不能通过的,有兴趣的小伙伴可以自己尝试。其实这题的双指针写法很难想,只能说多做,累积经验,这类型的题目接触多了或许就可以秒杀,反正我是做不到。首先,我们可以使用暴力解法,两层for循环枚举所有情况,枚举完所有情况将最大的值返回即可。原创 2023-12-07 22:57:35 · 558 阅读 · 13 评论 -
每日一题:LeetCode-75. 颜色分类
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!这题被标为了中等,还是有一定难度的,但是如果你很熟悉快排的过程那么这题对你来说就是小case了,因为这题其实就是以1为基准值,0甩到左边,2甩到右边,很多东西都是融汇贯通的。这题要求我们将三种颜色排好序,其实也就是对0,1,2的划分而已,如果你看了我前面写的题目的话,有一题。🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉。原创 2023-12-05 00:27:35 · 463 阅读 · 17 评论 -
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!可以看到我们的测试用例过了,但是我们的执行结果却超时了,这说明我们的时间复杂度就太高了,我们应该想一想其他的方法来降低时间复杂度,这就是我接下来要说的————滑动窗口。今天是第一次写滑动窗口的题,果然非常奇妙,居然只有O(N)的时间复杂度,理解滑动窗口的本质才有助于你解决类似问题不会毫无思路。我们可以看到,如果是最坏的情况,原创 2023-12-03 22:00:51 · 403 阅读 · 10 评论 -
每日一题:NowCower-JZ64.求1+2+3+...+n
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,拾取经验,终能成圣🙏🙏!开启我们今天的斩妖之旅吧!虽然这题限制了我们一些语法以及常用的运算符,但是我们依旧可以通过C/C++的语法来解决,其中构造函数和右移运算就是很好的解题方案。🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉。对C++语法理解到位,这题就不难了。项数 / 2 == n。原创 2023-12-02 10:18:13 · 352 阅读 · 8 评论 -
每日一题:LeetCode-1089. 复写零
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!开启我们今天的斩妖之旅吧!虽然这题是让我们在原数组操作,但是我们不妨先开辟一个数组,cur指针指向原数组,dest指针指向新数组,只要cur不为0,dest就复制cur的值,如果cur为0,dest就移动两步,且每一步都写为0。这个时候,我们的cur的位置就是最后需要复写的位置,而dest正是我们需要复写的最后一个元素。原创 2023-12-01 11:39:53 · 594 阅读 · 13 评论 -
每日一题:LeetCode-283. 移动零
首先题目给我们一个数组,让我们最终得到的结果被划分成两个区间,一个是元素为0的区间,一个是元素不为0的区间。我把这类题目称为划分数组的题目,而解决这类将数组划分为几个区域的问题,我们经常会使用双指针算法。双指针问题在数组划分类似的问题中非常常见,双指针并不一定是C语言语法中的指针,可以是数组下标,或者某个索引等…原创 2023-11-29 23:31:21 · 288 阅读 · 6 评论 -
每日一题:LeetCode-202.面试题 08.06. 汉诺塔问题
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!汉诺塔问题很经典,虽然不像二叉树那样直观的感受就是递归,这里就不得不说递归的本质了,其实就是将大问题拆分成小问题,在将小问题拆分成结构相同的小问题。汉诺塔问题是很多小伙伴第一次接触到的递归的题目,非常的经典,当然现在来看其实原理也很简单,我们只需要将大问题拆成子问题就可以了,这道题目的拆解还是比较简单的。原创 2023-11-28 23:37:50 · 299 阅读 · 3 评论 -
每日一题:LeetCode-202.快乐数(一点都不快乐)
虽然力扣把这题给标为了简单,但是如果你想不明白给的第二个条件,这题和困难也相差无二,第一个条件是给你一个正整数,每个位置的平方和就是下一个位置,第二个条件其实说明了在这里只有两种情况,一种是最后变成1一直循环,另外一种情况是存在一个环使得这个数永远不能为1。是1就快乐数,不是1就不是快乐数。👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!循环会不会是无限不相等的循环?原创 2023-11-27 22:25:59 · 1273 阅读 · 64 评论 -
每日一题:LeetCode-LCR 143.子结构判断
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!开启我们今天的斩妖之旅吧!A树B树必须都不为空树,而且B树一定要是A树的一部分结构或者就是A树,这才能满足B是A的子结构。1、B树为空或者AB都为空的情况,但是题目明确要求了,AB有一个为空,都不为另一棵树的子结构,所以第一点情况是false。3、B树是A树的一部分,并非子树,题目示例也说明了这种B树是A树的子结构。原创 2023-11-26 18:48:38 · 442 阅读 · 30 评论 -
每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历
💪💪当然切记不可😈走火入魔😈,每日打怪,日日累积,终能成圣🙏🙏!本题和昨天写的题很像,只不过这次的层序遍历是要从叶子结点所在层向上进行层序遍历,既然我们使用二维数组来进行层序遍历,我们不妨先将正常的层序遍历保存到二维数组中,在正常的层序遍历完成之后,将二维数组的元素(一维数组,存的是每一层节点的值)首尾交换。这两题的相似度很高,我这里都是使用深搜的方式得到正常层序遍历的结果,当然你可以使用队列的形式得到层序遍历结果,这里就不展示了,这两题的不用是对层序遍历的结果的处理,转换成另外的形式。原创 2023-11-25 16:00:58 · 432 阅读 · 28 评论 -
每日一题:LeetCode-102.二叉树的层序遍历
说到二叉树的层序遍历,我们第一反应肯定是用广度优先搜索,广搜需要队列存储每一层的节点,当一层节点处理完之后再将本层已处理的节点全部pop掉,接着处理下一层节点,直到处理完毕,深搜便完成了,这里题目要求用二维数组来接收深搜的结果,所以我们可以开个二维数组,在每层节点pop之前,把每层节点记录在一位数组中,最终把一维数组放到二维数组中。使用深搜也就是dfs,那么如何深搜才是关键,其实我们只需要知道每个节点的层数就可以进行深搜了,我们可以直接用节点的层数把深搜的每个节点压入到对应层的数组中。原创 2023-11-24 17:11:13 · 1088 阅读 · 45 评论 -
每日一题:LeetCode-105.从前序遍历与中序遍历构造二叉树
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。这是一道力扣的中等题,总的来说也并不算很难,理解掌握对前序遍历与中序遍历递归构建的过程才是最重要的。🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉。原创 2023-11-23 17:00:00 · 392 阅读 · 23 评论 -
每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树
👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!但是这样写的效率非常低,将ans数组拷贝到tmp数组,再将tmp数组拷贝回原数组,这样来来回回的拷贝效率实在是很低,所以我们可以考虑用封装来优化。,递归过程中需要调用栈的开销,平均情况下为 O(logN),最坏情况下树的深度为 N−1,此时需要的空间复杂度为 O(N)。,其中 n 为 N 叉树的节点。原创 2023-11-22 23:05:09 · 875 阅读 · 20 评论