随笔分类 -  leetcode / leetcode hot100

leetcode hot100
摘要:题目链接 解题思路 用双指针,或者辅助数组的方法这里就不过多解释了,现在说最优解。 我们可以利用两个数组「有序」的特点,找到其中位数。 直接举例子,假设其中一个数组nums1是[1, 3, 5, 7, 9],另一个数组nums2是[2, 4, 6, 8],中位数我们先人工算出来,是5,也就是整体的第 阅读全文
posted @ 2024-11-15 20:56 ouyangxx 阅读(135) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路 子串问题,思考,「以i开头」结果是什么,求出所有的结果,然后最长的那个就是答案。或者「以i结尾」结果是什么,求出所有的结果,最长的那个就是答案。 本题使用「以i开头」结果是什么。 当求出i开头的结果是[i, j],那么怎么求i+1的结果?其实就是滑动窗口。现在的窗口是[i, j] 阅读全文
posted @ 2024-11-15 20:35 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路 一道回溯的题目。 我现在在[i, j],然后处理到单词的index位置,index之前的都已经解决了,现在要往哪走?很明显如果[i + 1, j]的位置等于index的单词,我可以去「试试」能不能走通。所以其实很简单,每当来到[i, j],单词index,我就看上下左右四个位置, 阅读全文
posted @ 2024-11-15 20:29 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路: 对于这类递归问题,采用「宏观」思考模式。 对于任意一个节点A,左子树先「展开为链表」,右子树再「展开为链表」,然后A节点,将左子树的结果,和右子树的结果,「串在一起」即可。 左子树展开为链表,所以要返回两个节点,一个是链表的头,然后是链表的尾。 代码 /** * Definit 阅读全文
posted @ 2024-11-15 20:21 ouyangxx 阅读(4) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路 分情况讨论即可 两个头都是空,直接返回空 若root1为空,直接返回root2 若roo2为空,直接返回root1 若都不空,则二者相加,得到一个新节点A,然后二者的左子树去合并,得到一个新左子树new_left,二者的右子树去合并,得到一个新右子树new_right,然后新节点 阅读全文
posted @ 2024-11-15 19:58 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路 普通的递归可能很简单,但是,现在要求,使用「二叉树递归套路」来思考问题 每个节点需要什么信息?如果根节点,能够有一个「最大深度」的信息,那么直接返回就可以了。那么,这个信息可以通过左子树信息 + 右子树信息 得到吗? max(左子树最大深度, 右子树最大深度) + 1,就是该节点 阅读全文
posted @ 2024-11-15 19:48 ouyangxx 阅读(4) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路 这种二叉树的题目,绝大部分可以用「二叉树的递归套路」来解决,那么什么是「二叉树的递归套路」?其实就是每个节点会有信息,该节点信息怎么来的?左儿子的信息 + 右儿子的信息 ,然后加工成自己的信息。 根结点是否是搜索二叉树?需要左儿子和右儿子给什么信息? 首先要知道左子树和右子树,是 阅读全文
posted @ 2024-11-15 17:26 ouyangxx 阅读(15) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路 层序遍历就是用队列,本题需要一层一层收集答案,所以我们可以用一个变量cur,表示该层还剩多少节点需要收集,同时,遇到一个节点,还要将其孩子节点放入队尾。那么我们怎么知道下一层的节点个数,所以还需要一个变量next,记录下一层的节点个数。 总结一遍:每次从队头拿出一个节点A,然后把 阅读全文
posted @ 2024-11-15 17:03 ouyangxx 阅读(8) 评论(0) 推荐(0) 编辑
摘要:题目链接 递归版本很简单,这里就不过多介绍,接下来使用非递归版本,就是使用栈,并且是前、中、后序遍历,统一一套逻辑的非递归的二叉树遍历。 中序遍历:遍历顺序是,左中右,不能使用递归,那我们就要自己使用栈来保存「现场」。当来到一个节点时,第一次来到,不能够输出,要先将左子树的内容全部得到后,再输出该节 阅读全文
posted @ 2024-11-15 16:09 ouyangxx 阅读(32) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路 检查一个二叉树是否轴对称,其实和根结点无关,而是和其左右子树有关。 左子树头等于右子树头,然后递归调用,「左子树的右儿子」要等于「右子树的左儿子」并且「左子树的左儿子」要等于「右子树的左儿子」。 代码 /** * Definition for a binary tree node 阅读全文
posted @ 2024-11-11 15:53 ouyangxx 阅读(20) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路 暴力怎么做?n个节点,我们要先选头节点i,头节点选中之后,左子树的节点数就决定了,右子树的节点数也就决定了,所以选择头节点i后,不同的数目是左子树不同数目 * 右子树不同数目,这又是子问题了,又可以递归得到结果。 有一个细节,假设n等于5,1,2,3,4,5,假设现在选择了3为头 阅读全文
posted @ 2024-11-11 15:44 ouyangxx 阅读(4) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路 暴力怎么做?我们可以枚举, 矩阵的底,必须是第0行,求一个最大值,矩阵的底,必须是第1行,求一个最大值,把所有的都得到,然后最大的那个,就是结果。 依次类推,所有结果的最大值,就是全局最优解 举个例子,假设矩阵 [ [1, 0, 1, 0, 0], [1, 0, 1, 1, 1] 阅读全文
posted @ 2024-11-11 15:18 ouyangxx 阅读(4) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路: 题目乍一看没有思路,那我们来想一想如果暴力求解怎么办。最大的矩形,他总有一个高(竖着的),然后有一个宽(横着的),那我们就暴力求解每一个高,也就是每一个下标i,对应的heights[i],最大的宽是多少,然后求出所有的解后,最优的便是结果。 怎么求解以heights[i]为高, 阅读全文
posted @ 2024-11-11 14:44 ouyangxx 阅读(9) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路: 方法一:两个for循环,时间复杂度:O(n^2) 方法二:先排序,然后双指针,时间复杂度:O(n * logn) 方法三:使用一个set,从左往右遍历,每次遍历到一个数num,先查找set,是否存在target - num的数,如果存在,直接返回了。时间复杂度:O(n)。 因为 阅读全文
posted @ 2024-11-11 14:25 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路 从左往右的尝试,暴力递归(回溯),process(index, path),来到index,两种情况,要index的数,或者不要index的数 代码 class Solution { public: void process(vector<vector<int>> &ans, c 阅读全文
posted @ 2024-11-11 11:29 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路 求最小子串问题,第一时间,想「以i开头的结果是什么」,求出所有的结果,最优的便是;或者「以i结尾的结果是什么」,求出所有的结果,最优的便是 这个题使用「以i开头的结果是什么」,假设是[i, j]然后再求i+1的结果时,我们发现,只需要把i位置的字符去掉,就可以知道是否满足结果,如 阅读全文
posted @ 2024-11-11 11:24 ouyangxx 阅读(14) 评论(0) 推荐(0) 编辑
摘要:题目链接 这就是「荷兰国旗」问题,把颜色分成左边红色、中间白色、右边蓝色的顺序,实现快排的一部分步骤。 解题思路 我们可以有一个left_border变量,表示[0, left_border]都是红色,同时,一个right_border变量,[right_border, n - 1]都是蓝色,那么[ 阅读全文
posted @ 2024-11-11 10:11 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路 直接暴力递归,process(i, j):word1[i...]转换成word2[j...]需要的最少操作次数,也就是说,i字符之前的不用处理了,已经变成了j字符之前的了。 如果word1[i] == word2[j] 可以什么操作都不干,i和j就完成了,所以返回process( 阅读全文
posted @ 2024-11-11 09:26 ouyangxx 阅读(3) 评论(0) 推荐(0) 编辑
摘要:题目链接 这道题目与62.不同路径很像,来到[i, j]位置,只能向下,或者向右走,只不过改题是要求总和最小。 process(i, j):当前在[i, j]位置,返回最小路径和 所以当在[i, j],如果还能往下走,一种答案就是process(i + 1, j) + grid[i][j] 如果还能 阅读全文
posted @ 2024-11-11 08:58 ouyangxx 阅读(2) 评论(0) 推荐(0) 编辑
摘要:题目链接 解题思路 方法一:暴力递归,process(i, j),当前在[i, j]位置,到达右下角有多少种方法? 如果i < m - 1,那么可以往下走,所以结果加process(i + 1, j) 如果j < n - 1,那么可以往右走,所以结果加process(i, j + 1) 因为只有两个 阅读全文
posted @ 2024-11-10 22:08 ouyangxx 阅读(5) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示