
刷题
文章平均质量分 67
小柯同学_2019
想做什么,就现在,马上做~
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java比较器的设计采坑点
大纲: 如果是基本数值类型的比较时,直接使用java自带的比较器 如果一定要自己实现,建议比大小,而非使用差值来判断,有溢出危险 如果第一个大于第二个,返回1,表示的是两个数不改变顺序,默认是升序。 记得把leetcode的题目截图附上。 class Solution { public int findMinArrowShots(int[][] points) { // 根据每个二元数组的第二个位置排序,升序; // 如果后一个的第一位,均小于第一个的第二位,都是原创 2022-05-01 12:51:20 · 285 阅读 · 0 评论 -
Leetcode刷题(32)每日一题:两个数组的交集II
一段时间没有练习代码,真就生疏了。果然代码是要天天练的。 今天的题目需要使用字典,不过年代久远,基本的操作又都忘了…… 业精于勤荒于嬉,果然不是随便说说的。 题目 350. 两个数组的交集II ...原创 2020-07-13 18:04:32 · 461 阅读 · 0 评论 -
Leetcode刷题(31)二叉树专题(31)二叉树专题:树的后序遍历(递归和迭代)
题目 145. 二叉树的后序遍历 难度:困难 题目分析:如果采用递归的方法,那难度其实等于0。 对于后序遍历来说,最难的其实是迭代的方法。因为后序遍历的顺序是 左-右-根,这意味着,找到最左的叶子之后,还要再往右边可能的叶子找,最后才能输出根节点位置的值。 2. 解法一:递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x #原创 2020-06-19 17:14:13 · 317 阅读 · 0 评论 -
Leetcode刷题(30)二叉树专题:树的中序遍历(递归和迭代)
题目 94.二叉树的中序遍历 难度:中等 题目分析:二叉树的题目基于递归的解法,跟套模板一样,都不需要怎么思考。重点在于掌握迭代的方法,这样有助于理解遍历的过程。 中旬遍历,是 左 - 中 - 右的顺序 2.解法一:递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None #原创 2020-06-19 12:48:48 · 343 阅读 · 0 评论 -
Leetcode刷题(28)二叉树专题:树的前序遍历(三种方法:递归、迭代的两种写法)
本篇重要参考资料(点此跳转)。这篇解析,不仅简单介绍了二叉树这种数据结构,还详细罗列了各种不同遍历的方法,对于我使用的教材是个很好的补充。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def原创 2020-06-18 13:03:00 · 436 阅读 · 0 评论 -
Leetcode刷题(29)二叉树专题:求树的深度(递归、深度优先搜索、宽度优先搜索)
题目 104. 二叉树的最大深度 难度:简单 分析:最简单的方法是使用递归,代码最少,速度也不慢;同时可以单独维持一个栈或是队列,使用深度优先搜索(DFS)或是宽度优先搜索(BFS)来得出答案。 不管是使用哪种方法,所有节点都必须被遍历,才能获得答案。 解法一:借助队列,宽度优先搜索 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x #原创 2020-05-24 20:22:03 · 780 阅读 · 0 评论 -
Leetcode刷题(27)动态规划专题(5):区域和检测(使用缓存加快计算速度)
题目 303. 区域和检索 难度:简单 题目分析: 解法一: class NumArray: def __init__(self, nums: List[int]): self._nums = list(nums) # 断开二者联系 def sumRange(self, i: int, j: int) -> int: return sum(self._nums[i:j+1]) 运行结果: 解法二: class NumArray: def原创 2020-05-17 12:35:13 · 298 阅读 · 0 评论 -
Leetcode刷题(25)动态规划专题(3):打家劫舍II (考虑环形排列的房间,拆分求解)
题目 213. 打家劫舍II 解法:拆分房间为两个链表 运行结果:原创 2020-04-11 19:32:08 · 421 阅读 · 0 评论 -
Leetcode刷题(24)动态规划专题(2):打家劫舍(特殊限制的字符串和)
题目 198. 打家劫舍 难度:简单 题目分析:现在对于动态规划,我开始能依葫芦画瓢写出解答代码,不过这中间的正确性,对于我来说还是有点难度。 依据动态规划的解题步骤,我们首先定义 dp 数组的含义。 此处定义 dp[i]表示到达位置i, 小偷所能偷到的最大和 相应的递推公式:dp[i]=max(dp[i−1],dp[i−2]+nums[i]),dp[i] = max(dp[i-1], dp[...原创 2020-04-07 12:38:19 · 232 阅读 · 0 评论 -
Leetcode刷题(23)动态规划专题:最大子序和
题目 解法一:暴力搜索,超时 class Solution: def maxSubArray(self, nums: List[int]) -> int: # 尝试一个个加 if len(nums) == 0: return 0 row = len(nums) mini = 0 ...原创 2020-04-07 10:12:42 · 358 阅读 · 0 评论 -
Leetcode刷题(22)动态规划专题:爬楼梯(重新包装的斐波那契数列,动态规划使用三部曲总结)
题目 70. 爬楼梯 难度:简单 题目分析:这道题是动态规划系列的第一个例题,因此,这里总结下使用动态规划的三部曲。 1. 定义数组 dp[n] 的含义,这个根据具体题目来赋予含义, 这道题是 台阶 n 拥有多少种走法 2. 找出更新数组的递归公式,比如这题是 dp[n]=dp[n−1]+dp[n−2]dp[n] = dp[n-1]+dp[n-2]dp[n]=dp[n−1]+dp[n−2]...原创 2020-04-03 16:47:49 · 278 阅读 · 0 评论 -
Leetcode 刷题 (21)堆栈的应用:字符串处理技术(分类有序,避免冗余,递归解法,O(n)复杂度)
题目 394. 字符串解码 难度:中等(这道题花了我好长时间,最后是修修补补才做出来……如果是简单题,我就哭了) 题目分析:这道题,由于每次读取一个字符,大部分时候不能马上确定最后的形式,因此,需要借助缓存结构;而由于中括号“[ ]”有嵌套(如“3[a2[c]]”,得先转换成“cc”, 在跟“a”拼接),后读取的要先处理,因此选择栈来辅助存储。 于是,剩下的问题便是怎么使用栈来存储数据的问题,应...原创 2020-04-03 13:27:14 · 250 阅读 · 0 评论 -
Leetcode刷题(20)栈和队列的基本应用:用队列实现栈
题目 225. 用队列实现栈 难度:简单 题目分析: 这题主要考察对于栈和队列性质的理解,他们的本质不同就在于元素进入和弹出的顺序,完全相反。栈是 Last In First Out (LIFO), 队列是 Fisrt In First Out (FIFO), 实现起来有点变扭。 解法: class MyStack: from collections import deque ...原创 2020-04-02 17:10:47 · 280 阅读 · 0 评论 -
Leetcode 刷题 (19):堆栈和队列应用:图像渲染(简单版的数岛屿)
733. 图像渲染 难度:简单 题目分析:这道题是容易版的数岛屿(数岛屿详细解析戳这里传送门)。简单的地方在于,对于岛屿题目,我们是不清楚“1” 会出现在什么地方,所以需要构建一个双层循环,遍历矩阵每一个点;而这道题,直接给了起点,所以我们把周围一片找出来即可。 1. 解法一: 递归实现的DFS class Solution: def floodFill(self, image: Li...原创 2020-03-31 21:14:10 · 314 阅读 · 0 评论 -
Leetcode刷题(18)栈的应用:钥匙和房间 (深度分析堆栈使用的易错点)
题目 841. 钥匙和房间 难度:中等 题目分析: 解法一:我自己想的,兜圈了…… class Solution: def canVisitAllRooms(self, rooms: List[List[int]]) -> bool: # 基于栈的探索可以解决,反正就是一个个试 # 建立一个答案数组,没探索的标1, # 等栈探索完,...原创 2020-03-31 16:14:26 · 501 阅读 · 0 评论 -
Leetcode刷题(17)队列的应用:01矩阵(寻找最短路径问题,BFS应用,动态规划最优解法)
题目 542. 01矩阵 难度:中等(很高兴,现在leetcode关于栈和队列的中等题,我拿到手,都有思路了,也能做出来,博客没有白总结~) 题目分析:从非零的数往四周探索,找到的第一个零,记录下此时的步数,如果是使用广度优先搜索(BFS), 那找到的这个,便是最近的距离;不过缺点也很明显,每一次到一个新的非零的位置,都要重复进行一样的工作,而且麻烦的是,之前的结果,不能被有效利用。下面是我基...原创 2020-03-30 08:56:46 · 1211 阅读 · 0 评论 -
Leetcode 刷题(16)卡牌分组:朴实的求解方法(Reduce函数使用和基于字典的数字统计)
题目 914. 卡牌分组 难度:简单(对我来说一点也不……) 题目分析: 卡牌分组,要求每个组里的数字一样,而且每个组的卡牌数一样多 因此,这道题需要预先统计卡片有多少个数字,每个数字有多少张牌 再往下推论,可以发现,题目需要找的数字 X 应为每种数字个数的公约数,这样每种数字才有可能根据 X 分成一堆堆。 1. 错误解法: 这种类型的题,其实就考察一个点,这里是求一堆数字的最大公约数...原创 2020-03-28 16:15:47 · 335 阅读 · 0 评论 -
Leetcode 刷题 (14) 队列和堆栈应用实例:目标和(吐血整理 01背包问题、动态规划易错点,深度分析)
题目 494. 目标和 难度: 中等 题目分析:这道题第一眼,竟然不知道如何下手……说明我对于BFS和DFS的掌握还不扎实。最后是看了答案才有点明白,这个问题其实就是背包问题的变形……于是,直接的解法是使用递归的方法来实现DFS,或者我们自己维持一个栈来编写非递归的解法;自然,这里也可以使用BFS,因为题目需要我们找出所有解,这两种方法只是前进方向不一样。 另外值得一提的是,这个方法也能使用动...原创 2020-03-27 16:21:40 · 444 阅读 · 0 评论 -
Leetcode刷题(15)堆栈的应用:求每日温度(最快解法)
题目 739. 每日温度 难度:中等 题目分析: 用一个列表来保留数据,温度的索引,因为有了索引,我们也能获得温度; 建立一个跟温度对应的答案列表 栈顶元素跟新元素比较,如果小于,就弹出栈顶元素;此处要持续比较,要确保栈里元素从大到小排列 栈顶元素和新元素,两个索引相减,就是对应的天数,填入栈顶元素对应的位置 如果小于栈顶元素,就入栈 解法一:粗略版,细节没有优化 class Solutio...原创 2020-03-27 10:15:55 · 211 阅读 · 0 评论 -
Leetcode 刷题(13)队列和堆栈应用实例:求岛屿数量(三种解法)
题目 200. 岛屿数量 难度 : 中等 题目分析:对于岛屿的定义是,周围被一圈 “0” 包围,观察例子可以发现,在扫描矩阵的时候,只要发现一个“1”, 就能确定找到一个岛屿。这道题的关键在于,如何把找到的“1”周围相连的“1”都找出来,并进行标记,从而跟另外可能存在的岛屿分开。 基于一个已有的点,向四周搜索的过程,固定有两种策略,一个是深度优先搜索(DFS), 一个是广度优先搜索 (BFS...原创 2020-03-21 19:52:59 · 415 阅读 · 0 评论 -
Leetcode 刷题(12)队列应用:广度优先搜索求完全平方数
题目 63. 完全平方数 难度:中等 题目分析:找一个和的可能拆分,在不清楚数学解析解的时候,就是一个状态空间搜索的问题。对于搜索问题,有两种策略。一种是广度优先搜索,即BFS;另一种是深度优先搜索,即DFS。这里答案是需要我们找到个数最少的拆分,所以,用广度优先搜索是最合适的策略。使用深度优先搜索,只能是找到所有解后,从中确定最优解。 这道题不要求我们写出拆分方式,只要个数,所以,最合适的是B...原创 2020-03-18 21:53:25 · 236 阅读 · 0 评论 -
Leetcode 刷题 (11) 队列:设计循环队列
题目: 622. 设计循环队列 难度: 中等 题目分析: 看下面代码实现。参考的是裘宗燕的《数据结构与算法:Python语言描述》。此处不建议使用python内置的list的append, pop操作,使用了就违背设计循环队列的初衷:消除代价为O(n)的出队操作。 解法: class MyCircularQueue: def __init__(self, k: int): ...原创 2020-03-10 15:20:49 · 412 阅读 · 0 评论 -
Leetcode 刷题 (9)简单单链表:奇偶链表
题目 328. 奇偶链表 难度: 中等 题目分析: 使用原地算法,也就是不使用额外的储存空间,仅借助于额外的指针,同时遍历有限次链表完成。 解答: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.ne...原创 2020-03-08 16:28:35 · 372 阅读 · 0 评论 -
Leetcode 刷题(8)简单单链表: 删除链表倒数第N个元素
题目 19. 删除链表的倒数第N个节点 难度: 中等 题目分析: 链表中的题目,指针相当于免费资源,可以根据需要增加。双指针法、快慢指针法在环形链表,应用很多。 解法一: # 对于这种题目,循环结束条件设为快指针到达最后一个元素即可,然后倒数第几个元素,就让慢指针慢几步就好。 # 增加头部,是为了统一删除元素的代码 temp_head = Lis...原创 2020-03-08 12:33:36 · 429 阅读 · 0 评论 -
Leetcode 刷题(7)简单单链表:确认相交链表
题目: 160. 相交链表 难度:简单 题目分析:如果没有存储空间限制,可以把其中一个链表存到集合 set() 里面,然后再遍历另一个链表,看是否有节点在集合里面。 巧妙点的方法是使用两个指针。 如果两个链表有相交,那么后面的整个部分,长度是相同的,所以,如果能消除不相交的部分的长度差,那它们之后肯定可以同时到相交点。方法很简单,每个指针都走一遍两个链表! 方法一:使用额外空间 # De...原创 2020-03-08 00:31:37 · 214 阅读 · 0 评论 -
Leetcode 刷题(6)简单单链表:找环形列表入口
题目 142. 环形列表II 难度: 中等 题目分析:使用额外空间,是最简单的方法,联系上一篇博客判读环形列表 使用额外空间的分析,在确认了有环的同时,第一个重复点,就是环的入口。 这道题同时有个非平凡的解法,基于使用快慢指针的解法,然后多定义两个指针,即能找到入口。 详细的图解和分析点这里 解法一: 使用额外空间 # Definition for singly-linked list....原创 2020-03-03 20:18:51 · 287 阅读 · 0 评论 -
Leetcode 刷题(5)简单单链表:反转链表
题目 Leetcode 206: 反转链表 难度: 简单 题目分析:这道题能充分体现链表相对list的优势,把链表反转,只需要调整链表指向,而不需要移动元素。 建立一个新链表,每次从旧链表拿下一个元素,插入新链表的头,这个操作的代价均是O(1), 效率高 解法一:建新表 # Definition for singly-linked list. # class ListNode: # d...原创 2020-03-03 19:47:05 · 282 阅读 · 0 评论 -
Leetcode刷题(4)简单单链表:判断链表是否有环
题目 Leetcode 141. 环形链表 难度: 简单 题目分析: 两种解法。 一种是使用快慢指针的方法,快指针移动速度是慢指针的两倍,这样,如果链表有环,快指针一定会从后赶上慢指针。 这种解法空间复杂度是O(1), 时间复杂度是 O(n)。 一种是借助python内置集合类型 set() 进行节点存储,发现了两个一模一样的节点,就能说明链表有环,同时,第一个重复的节点,也是这个环的入口。 ...原创 2020-03-03 18:37:29 · 376 阅读 · 0 评论 -
Leetcode 刷题(2)简单单链表:删除重复元素
链表删除元素后,注意不需要再调用 p = p.next, 因为 p.next = p.next.next, 已经更好了p.next了!原创 2020-02-28 22:25:42 · 278 阅读 · 0 评论 -
Leetcode 刷题(3)简单单链表:定义一个单链表数据结构
题目 解答 class LNode(): def __init__(self, val, _next = None): self.val = val self.next = _next class MyLinkedList: def __init__(self): """ Initiali...原创 2020-02-28 19:09:21 · 567 阅读 · 0 评论 -
Leetcode 刷题 (1) 简单单链表:合并两个有序链表
链表删除元素后,注意不需要再调用 p = p.next, 因为 p.next = p.next.next, 已经更好了p.next了! 递归虽然可以快速求解问题,然而却不是解法最快的方法。可以先快速求解问题,不过为了更快解答,还是需要非递归的解法。 ...原创 2020-02-27 12:51:49 · 450 阅读 · 1 评论