文章目录
前言
刷题总是容易忘记,每天做2题保持一个轻松愉悦的刷题状态。周末或者有空定期复盘,这个博客主要就是复盘使用的,所以基本上只是给我自己总结使用。希望能够坚持刷题的进度和复盘的频率吧,have a nice time~
总体进度
已解决 64/1673
简单 20
中等 38
困难 6
分类详情
简单
20. 有效的括号
题目:https://leetcode-cn.com/problems/valid-parentheses/
提交/通过:2/1
思路:确实是简单题,在数据结构学习栈的时候讲过。遇到左括号一律入栈,遇到右括号则出栈,判断是否与当前的右括号匹配,不匹配则直接退出返回false
69. x 的平方根
二分查找
题目:https://leetcode-cn.com/problems/sqrtx/
通过/提交:1/1
思路:找某个数的平方根,只需要找到一个res使得resres小于等于x且(res+1)(res+1)大于x即可
错误:没注意直接用了sqrt了…
155. 最小栈
题目:https://leetcode-cn.com/problems/min-stack/
通过/提交:1/2
思路:和普通栈最大的不同就是要能够返回栈内的最小元素。因此使用了额外空间,建立了一个有序的栈内值的数组。在栈执行push操作的时候,需要准确找到位置并把新元素推入其中,即使存在相同值也要加入;pop操作的时候,到数组内删除一个与pop元素相同的值。在getMin的时候直接返回数组第一个元素即可。
136. 只出现一次的数字
位运算
哈希表
题目:https://leetcode-cn.com/problems/single-number/
通过/提交:1/1
思路:骚操作,位运算异或 ^=,即一个数异或自己后为0。数字0异或任何数字都等于那个数字,直接把数组中所有元素都放在一起进行异或运算,最后得到的结果就是只出现了一次的数字。
572. 另一个树的子树
二叉树
子树
相同树
题目:https://leetcode-cn.com/problems/subtree-of-another-tree/
通过/提交:1/2
思路:先说结论,一个二叉树的子树要么是它本身,要么是它左子树的子树,要么是它右子树的子树,依此规律进行递归。写成代码则为isEqual(s,t) || isSubtree(s.left, t) || isSubtree(s.right, t)
注意点:在判断相等时需要注意,题目中如果树已经到达底部,再继续的话,传入的Node数据会直接为null,那么在判断相等时要考虑 ①当前节点同时为null,同时到底,相等 ②只有一个节点为null,一个还有叶子节点一个没有,不相等
888. 公平的糖果交换
题目:https://leetcode-cn.com/problems/fair-candy-swap/
通过/提交:1/2
思路:通过交换数组元素来到达和相同,因此很容易想到解题的关键在于找到两个数组和S1与S2的差值d,与需要交换的元素之间的关系。即元素a1与元素a2之间的差值,应正好为d/2,且无需考虑小数与正负的情况。
错误:多余地考虑了正负情况,其实两个差值的符号保持一致即可。
中等
5. 最长回文子串
字符串
题目:https://leetcode-cn.com/problems/longest-palindromic-substring/
通过/提交:1/3
思路:由于回文串以中间点为中心(1个或2个数)两边均对称,因此考虑从头开始,以1个点或2个点(p == p+1)为中心,向两侧遍历进行判断。
错误:忘记如果2个点为中心成立的话,需要先看看length = 2是否大于之前判断得到的maxLength
17. 电话号码的字母组合
字符串
回溯
题目:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
提交/通过:1/1
思路:写了一个临时表,用于存放当前level下已输出的结果。遍历临时表将当前digits[level]数字对应的字母加在结果后面,全部遍历完后替换临时表结果,level++继续调用,直接level与digits的长度一致为止。
19. 删除链表的倒数第N个节点
链表
双指针
题目:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
提交/通过:3/1
思路:有时间复杂度的限制,需要使用双指针p和q,先移动q,当 q - p == n 时同时移动p,当q达到链表结尾时p所在的位置就是需要被删掉的节点的前一个,使p.next = p.next.next 即可。
34. 在排序数组中查找元素的第一个和最后一个位置
题目:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
提交/通过:2/1
思路:由于给定的是一个排好序的数组,所以解题核心是二分查找。但因为要查找的是两个位置,所以需要分成两块,先找到第一个位置s,再从s到数组结尾的部分查找最后一个位置e
50. Pow(x, n)
数学
快速幂
题目:https://leetcode-cn.com/problems/powx-n/
通过/提交:1/2
思路:递归执行,每次都将结果拆解为 x的n次方 = (x的n/2次方)的平方【偶数】或者 (x的n-1次方)乘x【奇数 -1后又变偶数】,但注意如果是负数次幂,则是(x的n+1次方)乘1/x
102. 二叉树的层序遍历
二叉树
广度优先搜索
题目:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
通过/提交:1/1
思路:正好之前为了做题读了一篇二叉树的层序遍历的博客,核心是建立一张HashMap表,key代表层数,value是个数组,表示这一层的节点。迭代时,总是先处理表中的第一个key,当key对应的数组全部遍历完了以后,则删掉这个key,往下遍历。遍历时,如果value中的节点有子节点,则将子节点推入current+1对应的结果中。
211. 添加与搜索单词 - 数据结构设计
数据结构设计
单词查找树
题目:https://leetcode-cn.com/problems/add-and-search-word-data-structure-design/
通过/提交:0/4
思路:
错误:没太明白题干要求的addWords要求是怎么样的,搜索的部分应该是没问题了。前面搜索部分错了几次主要是将.转换为\w{1}或[a-z]{1}的过程没有思考好。
221. 最大正方形
动态规划
图
题目:https://leetcode-cn.com/problems/maximal-square/
通过/提交:1/1
思路:
没怎么想明白,靠评论区题解过了。
假设每个遍历的点,都是要寻找的正方形的右下角。
那么对于此正方形,首先判断右下角是否缺失(0),缺失则直接为0;
如果不缺(1),那么它能达到的最大边长,应该是和另外三个点是右下角的正方形拼在一起后,得到的正方形边长。如果任意一个点的方形有缺失或边长较短,那么最大边长只能是这三个点的方形中较短的那个边长再+1,写成等式即为dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
,生成dp后再从dp中遍历出最大值即为结果。
236. 二叉树的最近公共祖先
二叉树
LCA
题目:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/
通过/提交:1/2
思路:对于要寻找最近公共祖先的pq来说,要么左右子树一边一个,要么p或q本身就是祖先且另一个节点在左子树或右子树中。
因此通过递归的方式去查找 root.left 和 root.right ,直到 root = p 或 root = q(找到了)或者 root = null 没找到,递归返回后如果 left 和 right 的结果均不空,说明为第一种情况左右子树一边一个,返回 root 即为正确答案。如果left 和 right 有一边为空,一边不空,说明为第二种情况,返回不空的那个即为正确答案。
390. 消除游戏
题目:https://leetcode-cn.com/problems/elimination-game/
通过/提交:1/1
思路:由于要找的是最后剩下的那个数字,只需要让一个变量始终等于剩余数列的第一个数字即可。观察可知,当从左向右删除,或从右向左删除且数列长度为奇数时,第一个数字需要被删除,变量后移。另外可以发现第一轮删除是隔1删除,到了第二轮对于整个数列就变成了隔2删除,第三轮隔4删除,依次类推。因此每次只需要根据情况,判断变量是否需要后移,直到剩余数量为1时,返回变量。
969. 煎饼排序
排序
动态规划
题目:https://leetcode-cn.com/problems/pancake-sorting/
通过/提交:1/2
思路:和汉诺塔问题一个解法,每次都找到当前数列的最大值,如果最大值不在首位,则先将[0, maxValueIndex]进行翻转,将最大值换到首位,然后再翻转[0, length],将最大值换到末位。递归执行[0, length - 1]的数列,直到最后数列长度为1,则排序完成。
错误:忘记考虑如果最大值本身就在第一位,则不需要再多执行一步。
1003. 检查替换后的词是否有效
字符串操作
匹配
题目:https://leetcode-cn.com/problems/check-if-word-is-valid-after-substitutions/
通过/提交:1/4
思路:以合法字符串作为split的分隔词,对目标字符串进行分割,余下的部分再组装后递归调用,直到字符串不再含有分隔词(split的结果集长度等于1),此时判断是否为合法字符串或空(自身就是合法串)
错误:一开始隐约觉得要递归处理,但是看了样例以后觉得先提交试试结果出错。另外就是没有注意自身就是合法串的情况。
1023. 驼峰式匹配
字符串操作
匹配
题目:https://leetcode-cn.com/problems/camelcase-matching/
通过/提交:1/9
思路:通过匹配正则表达式来进行字符串的验证,需要特别注意①pattern串中可能出现全小写的情况②与其用^和$结尾来判断合法性,不如直接用substring来进行判断更有效③仔细归纳可能出现的情况④题目中只有大小写字母,不用正则表达式可能更简单
错误:对题目理解不清,过于急躁的提交了答案,应该更多地考虑可能出现的情况以及现阶段的驼峰匹配是什么思路。
1404. 将二进制表示减到 1 的步骤数
题目:https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-in-binary-representation-to-one/
通过/提交:1/2
思路:直接对二进制进行操作:如果末尾为0,表示偶数,直接弹出末尾(>> 1表示除以2);如果末尾为1,表示奇数,需要先 +1,从后往前遇到0变1,直到遇到第一个0变1(进位)提前结束遍历。如果结束遍历仍未遇0,则需unshift以进位。
错误:本来想将二进制转换为十进制后再处理,但是由于题目的二进制数字最大可能有500位,超过了JS的安全数大小(53位,2的53次方),所以在超大数字处理时会有错误。