![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
biluo_
这个作者很懒,什么都没留下…
展开
-
LeetCode-115 真的没想出来状态转移方程
一、心路历程这道题是有关字符串的问题,与之前字符串匹配的问题不同,它要求的不是子串匹配,也不是模式串匹配,而是序列匹配。问题发生了变化,但不变的思路是:暴力!暴力就完了! ,这道题如果使用暴力法可就真的“完了”。暴力法是使用类似bfs的思路,每一层递归遍历两个字符串,当某一位字符相同时,就递归到下一层,判断这一位之后的子串的匹配情况,当递归到 t字符串尾时,就将匹配方案数加一。还可以有剪枝的操...原创 2020-02-10 20:43:28 · 192 阅读 · 0 评论 -
LeetCode-108-109 对链表的二分方法
一、思路这两道题都是要求将线性表转换成二叉搜索树,数组转化为二叉搜索树是很简单的,使用标准的二分法即可,不再赘述,之后附上代码。重点的问题是如何将链表转化为二叉搜索树(这里就不谈将链表转为数组这种只为AC的方法了)。由于不能用下标来访问链表,所以单纯地用数组转树的二分法是不合理的。那么不使用下标,该如何访问链表中点处的节点呢?方法是用快指针和慢指针来查找中点处的节点:快指针每次移动两个节点,慢...原创 2020-02-08 22:44:36 · 189 阅读 · 0 评论 -
LeetCode-51/52 经典回溯问题
一、思路N皇后问题可以说是最经典的回溯问题,经典到刚接触C语言的时候,就有讲到这个问题。现在重新看这个问题,就会比较熟练:问题是在模拟摆放皇后,使他们满足皇后之间不可互相攻击这个条件。国际象棋中,皇后可以横、直、斜着走,步数不受限制,但不能越子。如对国际象棋感兴趣可以自己在 https://lichess.org/ 这个网站上自己玩。如果将棋盘分成行、列、斜三种情况(斜这种情况其实还...原创 2020-02-08 14:51:59 · 176 阅读 · 0 评论 -
LeetCode-94 莫里斯中序遍历
中序遍历常见的是递归和用栈辅助遍历两种方法,这两种方法网上很常见,故我不再赘述。在看题解的时候,我看到一种莫里斯中序遍历,很有意思,就在写了一份关于这个的代码。一、思路首先是莫里斯中序遍历的过程:对于当前节点node来说,如果node的左子树是空的,那么就将node的值压入输出序列中,并更新node的值为其右指针;否则,将node左子树最右端节点的右指针指向node(这一步的目的之后...原创 2020-02-07 16:22:49 · 458 阅读 · 1 评论 -
LeetCode-103 双端队列
一、思路的诞生这个问题是在层次遍历的基础上做了延伸,寻找锯齿型的层次遍历。与一般层次遍历的单方向不同,锯齿形遍历是奇数层从左向右遍历,偶数层从右向左遍历(视根节点在奇数层)。这种对称的操作让我们想到了对层次遍历的数据结构队列进行改变,变为对称的双端队列(然鹅我并没有想到,我的想法还是使用队列,在入栈的顺序上做一些变化,后面会继续探讨这个想法不正确的地方。但是思路就是这样,把遍历的对称性作为突破口...原创 2020-02-06 12:46:53 · 339 阅读 · 0 评论 -
LeetCode-102 层次遍历
一、思路这道题使用的是二叉树的广度优先遍历,也就是层次遍历。与单纯的层次遍历不同的地方在于,这个问题要求返回的遍历结果是一个二维数组,一行代表树的一层。但是总的思路还是和层次遍历没有区别。为了知道二叉树中每一个节点位于书的哪一层的问题,需要标识每一个节点所在的层数,并根据层次遍历时的节点,对其子节点进行标识。在这里我想到的方法有两种:第一种是建一个队列保存节点的层数,与层次遍历的队列保持一一对...原创 2020-02-01 16:57:24 · 104 阅读 · 0 评论 -
LeetCode-99 二叉搜索树要往中序遍历去想
一、错误思路最开始的思路,是进行深搜,向左树走的时候节点 N 压入biggers栈中,向右树走的时候节点压入smallers栈中,当子树深搜结束后,再将栈顶的节点,也就是节点 N 弹出。然后每到一个节点 P,就判断该节点与biggers和smallers栈中所有元素之间的关系,如果该节点的值大于等于biggers数组中的某一个节点 Q1,或者是该节点的值小于等于smallers数组中的某一个节点...原创 2020-01-31 15:45:26 · 169 阅读 · 0 评论 -
LeetCode-100 留心小问题即可
一、问题及注意点这道题主要是考察对节点为空的情况时的考虑,想要访问某一个节点的内容,第一个需要解决的问题就是排除节点空的情况。剩下的就是编写类似深搜的代码。二、具体代码class Solution {public: bool isSameTree(TreeNode* p, TreeNode* q) { return helper(p , q); } ...原创 2020-01-31 09:16:25 · 104 阅读 · 0 评论 -
LeetCode-4 超多方法;找到多个变量之间的关系来减少变量个数
一、直接顺序遍历到所求位置所谓求中位数,实际上就是求两个数组排序后的第 tar 个元素(当两数组长度之和m+n为奇数时,tar1 = (m+n)/2,当为偶数时,tar1 = (m+n)/2,tar2 = tar1+1)。可以想到归并排序时归并的操作,cnt1和cnt2分别指向两个数组当前遍历到的位置,选择两数组中较小的元素,将其对应遍历指针cnt加一。在这里需要注意的是,有可能出现nu...原创 2020-01-29 23:38:18 · 303 阅读 · 0 评论 -
LeetCode-97 指数型增长的暴力果然不可行
题目分析这个题要求判断两个字符串s1、s2,是否能通过某种方式,将他们的字符任意排列,从而组成字符串s3,也就是题目所说的s1、s2交错组成s3。思路分析1、暴力法首先想到的是简单的暴力法,对问题进行递归。按字符顺序递归。假设某一层递归s1,s2,s3分别到达下标p1,p2,p3,问题变成分别尝试s3[p3]取s1[p1]和s2[p2](取的规则是字符要求相同)并继续递归。class S...原创 2020-01-28 10:40:59 · 218 阅读 · 0 评论 -
LeetCode-95 合理利用返回值
一、思路最开始做这道题的时候,我把题目理解成了值为1到n的二叉搜索树有几颗,而不是这些树分别是什么。但这两个问题的关联度较大,问题的关键在于想到:当我们确定了根节点的值是什么,那么他左右子树的取值范围就已经很明确了。若根节点的取值是在[left , right]中的一个值k,由二叉搜索树的定义可知,左子树的值在[left , k-1],右子树的值在[k+1 , right]。假设我们已经求出左...原创 2020-01-27 21:29:06 · 156 阅读 · 0 评论 -
LeetCode-92 哨位节点的重要性
一、解题思路这个问题其实等同于反转链表,只是将问题变成了子链表。在反转链表的时候,是引入了prev,scan,next三个指针,分别表示当前节点的前一个节点,当前节点,当前节点的后一个节点。遍历的过程只需要将scan->next赋值为prev。最后处理头节点即可。回到这个问题,其实就是在反转m至n号节点,将最后处理头节点的过程变成处理这一段链表两端节点。二、具体流程首先需要先找到第...原创 2020-01-26 12:51:58 · 245 阅读 · 0 评论 -
LeetCode-3 官方题解的优化滑动窗口
一、子问题解决这道题之前,可以先思考一个重要的问题,就是给定的一段字符串,如何判断它是否有重复的字符。法一、容易想到的是遍历每一个字符,判断在它之后是否出现相同字符,时间复杂度o(n^2)。法二、同LeetCode-1,用哈希表进行搜索加速:维护一个数组作为哈希表,初始化为0。遍历字符串,并将每个字符对应位置(eg:‘f’-‘a’ = 5,‘f’对应下标为5)置为1,如果该位置已经置1,那么...原创 2020-01-26 11:30:46 · 150 阅读 · 0 评论 -
LeetCode-2 需要考虑周全的问题
一次遍历这个问题主要考察的是链表的操作和出现特殊情况的处理。1、当两个链表一样长的时候,问题比较好处理,直接挨个相加即可;2、当两个链表不一样的时候,就需要对遍历节点进行判断,不能出现再访问属性val的语句;3、由于一条链有可能为空这种极端情况,所以不能简单的采用原地算法;4、问题有一个小坑,就是有可能最后还有一位进位,对这个情况要考虑在内;5、可以通过添加一个哑节点来减少代码;/*...原创 2020-01-23 10:53:21 · 197 阅读 · 0 评论 -
LeetCode-1 利用哈希表进行查找加速
问题可以转换为,已有一个ele(为数组中的任意元素),需要在数组中寻找另一个元素等于target-ele1、暴力遍历法最直观的想法遍历每一个元素,再对该元素进行遍历,查看是否有满足条件的其他元素,使得他们两的加和为target。class Solution {public: vector<int> twoSum(vector<int>& nums, ...原创 2020-01-23 10:24:59 · 227 阅读 · 0 评论