Leetcode刷题
leetcode题目解析
RickRickHU
这个作者很懒,什么都没留下…
展开
-
刷题第三天 203.移除链表节点 707.设计链表 206.反转链表
第三题反转列表,注意两个指针的移动,以及反转前提前保存下一个节点的位置,先保存下一个节点的位置,然后反转,让下一个节点的next指向前一个结点,然后顺序移动前一个节点和后一个节点,注意最后返回的是前一个结点,因为最后一次循环已经让前一个节点指向最后了。第二题设计链表写了很久都不能AC,要搞清楚需要操作的节点和当前指向的节点之间的区别,通常在有虚拟头节点的写法中,一般我们的指针指向的都是当前操作节点的前一个节点,所以在删除节点的时候,不用记录一下cur。如果不确定的时候可以用简单的初始情况画个图。原创 2023-10-27 23:22:38 · 39 阅读 · 0 评论 -
刷题第十二天 二叉树的递归遍历 144. 前序遍历 145. 后序遍历 94. 中序遍历
144. 二叉树前序遍历。145. 二叉树后序遍历。原创 2023-11-08 11:00:31 · 52 阅读 · 1 评论 -
刷题第五天 哈希表 242. 有效字母异位词 349.两个数组交集 202.快乐数 1. 两数之和
思路就是记录下遍历过的元素,然后每次找一下target减当前元素在不在遍历过的元素里,如果在的话返回两个下表。和前两题不同,前面是将数据映射到数组的元素位置,这题是利用集合记录下每一次的值,如果有重复的就退出。判断元素是否已经重复可以利用集合,集合的add函数,如果已经有重复的数字就不做任何操作。另外,计算数字每一位的平方和可以将数字转化为字符串,然后遍历字符串就可以。哈希表:利用数组的元素位置来表示不同的具体含义,哈希表保证一对一的对应。字母转化为数字: ord() 数字转化为字母chr()原创 2023-10-30 23:05:09 · 105 阅读 · 0 评论 -
刷题第十一天 239.滑动窗口最大值 347. 前k个高频元素
右端push_right_(val): 如果窗口中需要右进的值比单调队列中最右端的值大,那么就单调队列最右端的值右出一个,就是pop() "pop()默认是出右端",那么直到找到单调队列中最右端的值比需要右进的值大,则把这个值加入单调队列。左端pop_left(val) 如果窗口中需要左出的值和单调队列中最左端的值(默认是最大值,因为是单调队列)相等 那么就再单调队列中pop_left() 否则不做操作,这样保证了单调队列最左端的值就一直是滑动窗口中的最大值。1. .append(): 右添加元素。原创 2023-11-06 23:36:31 · 36 阅读 · 1 评论 -
刷题第十四天 104.二叉树的最大深度 111. 二叉树最小深度 222.完全二叉树节点个数
和最大深度差别在于处理的方式,碰到空的情况不能算深度。222. 完全二叉树节点个数。104. 二叉树最大深度。原创 2023-11-09 11:25:47 · 45 阅读 · 1 评论 -
刷题第九天 232.栈实现队列 225.队列实现栈
232. 栈实现队列。225. 队列实现栈。原创 2023-11-03 08:58:05 · 38 阅读 · 0 评论 -
刷题第一天 | 704. 二分查找 27.移除元素
闭区间:left 和 right都可以取到 所以是 0 和len(nums) -1;开区间:left 和 right都取不到 所以是 -1 len(nums);第一次写的时候让每次找到val之后就length - 1 这样不对,会遗漏后面还没有遍历到的元素。想了想应该把找到的val的数量记录下来,然后返回的时候减掉就行。双指针的思想,一次循环就可以搞定,要把握住循环中的不变量思想。另外需要注意区间问题,这里我考虑的是用数组实际的长度来表示。不同区间left和right的取值就不同。应该写成左闭右闭原创 2023-10-25 09:02:13 · 371 阅读 · 0 评论 -
刷题第十天 20. 有效的括号 1047.删除字符串中所有相邻字符 150. 逆波兰表达式
python2中 如果用 / 进行除法,如果前后都是整数,会自动进行整数除法并向下取整,而不是向零取整 比如1/-10 = -0.1 向下取整为 -1。python3中 用/进行除法,会默认进行浮点数除法 1/-10 = -0.1 如果int(0.1)是向0 取整 为0。看了题解之后发现可以利用括号互逆的性质,如果判断是左括号,就压栈右括号,这样可以少一个判断。python3中 int(1/-10) = int(-0.1) = 0。python2中 int(1/-10) = int(-1) = -1。原创 2023-11-04 22:48:38 · 41 阅读 · 1 评论 -
刷题第六天 454.四数相加 383.赎金信 15.三数之和 18.四数之和
前两个数去重是和其前一个数比,而left right去重是和后一个数比,因为前两个数的后面的数会和内循环冲突,所以不用比较。2. 三个数字如何去重,去重的位置: 对于第一个数字来说,因为是最外层的遍历,所以去重放在第一层循环里,比较的是其前一位。3. left和right的去重应该用while,因为如果有多个元素重复,只用if的话 还是会记录进去,比较的是其后一位。第二层循环遍历第二个数,第二个数的起始位置是第一个数+1, 从+2的位置开始判断,如果和前一个数重复就前进一位。原创 2023-10-31 23:16:15 · 39 阅读 · 1 评论 -
刷题第二天 | 977 有序数组平方, 209.长度最小的子数组 ,59.螺旋矩阵II
一开始没有想好双指针在同一个数组里怎么交换元素来实现,看了视频之后明白了 新定义一个数组,然后双指针移动来选取最大值。第三题做了很久,边界条件经常想不明白,看了卡哥的视频之后清楚了,每次循环要遵循同样的原则,每个边的处理条件一样,左闭右开,同时要搞清楚每一圈起点终点的变化,变量很多,需要好好复习一下。自己写双指针滑动窗口的时候,没有理清楚循环判断条件,在考虑同时更新i和j,看了视频之后理解了外循环只要遍历一次终点,每次计算窗口内的值,当值满足条件的时候,考虑往前移动起点。原创 2023-10-26 10:21:33 · 138 阅读 · 0 评论 -
刷题第七天 344.反转字符串 541.反转字符串II LCR 122.路径加密 LCR182. 动态加密 151.反转字符串中单词
python中的字符串都是不可变的,不能修改字符串中的单个字符,所以要先转化为字符列表,修改字符列表之后再返回字符串 = list(s) 以及''.join(s)反转用python很快,但是涉及到首位空格以及中间空格重复的情况,想到的是手动去重,但是python利用strip()可以去掉空格。可以采用多次反转的方式,先把前target个反转,再把后面的反转 最后整体反转就把前target个放到最后了。replace和join都可以实现:其中join的意思是使用前面的字符串作为连接符,链接后面的列表。原创 2023-11-02 00:01:18 · 100 阅读 · 0 评论 -
刷题第四天 24.交换链表节点 19.删除倒数节点 142.环形链表
链表类的题目纯想容易出错,画图之后就很清楚,交换节点和删除节点类似,断开之前要记录下下一个节点的位置 然后cur节点跳过后面的节点 指向cur.next.next, 然后pre节点指向之前保存的原来的cur.next,然后再让原来的cur.next指向新的cur。一开始没想出来,怎么判断链表有环,遍历的时候找不到终止条件,看了视频之后恍然大悟,太巧妙了,循环问题可以用追及的方法来判断,存在环的情况,有速度差就一定会相遇,相遇之后离入口的距离就是入环之前的距离差。24. 交换链表节点。19. 删除倒数节点。原创 2023-10-29 03:18:51 · 44 阅读 · 1 评论 -
刷题第十三天 102.二叉树的层序遍历 226.翻转二叉树 101.对称二叉树
用迭代的方式做层序遍历,利用队列,依次压入头节点并弹出,每次弹出的时候压入该节点的左孩子和右孩子。因为要用二维列表层序记录下弹出的节点,所以外循环队列不为空就进行,还需要内循环来控制每层弹出节点的数量,这个数量就是队列内循环结束后的长度。和广度优先搜索(层序遍历)的思想类似,也是利用一个队列,每次加入两个子节点,因为要翻转,所以先加入右子 再加入左子,然后把父节点的左右子互换位置。前序遍历,递归的思想 要考虑1. 递归的输入输出 2. 递归的终止条件 3. 单层递归的逻辑。102. 二叉树层序遍历。原创 2023-11-09 10:24:04 · 45 阅读 · 1 评论 -
刷题第八天 字符串 双指针总结 KMP首学
所以要计算一个字符串的前缀表,又称为next数组,要找到以首字符开头的所有字串,计算每个子串的最长相等前后缀的长度 然后整体组合起来就是字符串的前缀表。以首字符开头的所有字串,对应的前缀和后缀,以及最长的相等前后缀的长度分别是。所以ABABAB这个字符串的前缀表就是0,0,1,2,3,4。前缀表是 以首字符开头的所有子串 最长相等前后缀数的集合。前缀表示以首字符开头 不包含最后字符的字串,比如。后缀表示以末字符结尾 不包含首字符的字串,比如。aba的前缀是a,ab。aba的后缀是a,ba。原创 2023-11-02 23:34:29 · 32 阅读 · 0 评论