
LeetCode题解
文章平均质量分 52
小孟Tec
为什么我的眼里常含泪水?
因为我对这土地爱得深沉……
展开
-
1482_制作 m 束花所需的最少天数-二分绝妙应用
文章目录题目描述解析 - 二分python代码题目描述给你一个整数数组 bloomDay,以及两个整数 m 和 k 。现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花 。花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好 可以用于 一束 花中。请你返回从花园中摘 m 束花需要等待的最少的天数。如果不能摘到 m 束花则返回 -1 。解析 - 二分python代码class Solution: def minDays(self, bloomD原创 2021-05-09 18:29:26 · 150 阅读 · 0 评论 -
Leetcode-179.最大数 - python3 自定义排序
文章目录python3 自定义排序方式1方式2题目:对应解法1对应解法2python3 自定义排序方式1利用 functools.cmp_to_key 方法,接受排序函数from functools import cmp_to_keydef cmp_func(a, b): if a+b >= b+a: return 1 else: return -1方式2重写 __lt__ 方法class LargerNumKey(str):原创 2021-04-12 20:36:19 · 237 阅读 · 0 评论 -
AC自动机算法
文章目录IntroductionMethodCodeReferenceIntroduction要学AC自动机需要自备两个前置技能:KMP和Trie树 (其实个人感觉不会kmp也行,失配指针的概念并不难)其中,KMP是用于一对一的字符串匹配,而trie虽然能用于多模式匹配,但是每次匹配失败都需要进行回溯,如果模式串很长的话会很浪费时间,所以AC自动机应运而生,如同Manacher一样,AC自动机利用某些操作阻止了模式串匹配阶段的回溯,将时间复杂度优化到了O(n)O(n)O(n), n原创 2020-12-20 20:29:53 · 239 阅读 · 0 评论 -
MST_1584_连接所有点的最小费用_最小生成树 Minimum Spanning Tree
文章目录Prim AlgorithmKruskal AlgorithmLeetCode1584. 连接所有点的最小费用题目描述Prim解法 - 这里是稠密图 用O(n^2) 解法Kruskal解法ReferencePrim AlgorithmKruskal AlgorithmLeetCode1584. 连接所有点的最小费用题目描述Prim解法 - 这里是稠密图 用O(n^2) 解法class Solution: def minCostConnectPoints(self原创 2020-09-16 00:41:29 · 346 阅读 · 0 评论 -
410_分割数组的最大值_binary_search
文章目录题目描述思路题目描述思路二分class Solution: def splitArray(self, nums: List[int], m: int) -> int: def check(x: int) -> bool: total, cnt = 0, 1 for one in nums: if total + one > x:原创 2020-08-27 00:46:36 · 131 阅读 · 0 评论 -
1552_两球之间的磁力_Binary_Search
文章目录题目描述思路题目描述思路题意求最大化最小,类似这样的求最大化最小值、最小化最大值等都可以用二分搜索解决。class Solution: def maxDistance(self, position: List[int], m: int) -> int: """ 二分 """ if m==2: return max(position) - min(position) # 特判 def che原创 2020-08-27 00:43:40 · 186 阅读 · 0 评论 -
DFS+栈_ 子树中标签相同的节点数_198场周赛第2题
文章目录先贴一下用时广搜深搜代码先贴一下用时我觉得思路还蛮清晰的,有问题欢迎评论区指正本例是一个多叉树(树是一种特殊的图,不含回路),遍历方式有两种:深搜,广搜广搜即层次遍历,本题若用BFS来做,需要在节点入队时 保存分支信息,因为题目要求的子树包含的标签信息。如下图所示这里暂时没有想到较好的解决办法 -_-#下面看一下 深搜 的思路:深搜主要思路为:因为DFS是对应路径的,这里用哈希表暂存路径信息。遇到相同的标签,用栈来 存储 该路径的节原创 2020-07-20 00:30:21 · 185 阅读 · 0 评论 -
拓扑排序 原理介绍 - Topological Sort Introduction
文章目录拓扑排序的典型应用拓扑排序的求解方法reference拓扑排序的典型应用修课顺序项目编译顺序拓扑排序的求解方法对于一个有向无环图来说拓扑排序的结果遵循如下规则,即如果有一条从顶点viv_ivi指向顶点vjv_jvj的边,那么最后的排序结果中viv_ivi一定在vjv_jvj 的前面。例如这个图的拓扑排序就是1 2 3 4 5。同一个图可以有多个拓扑排序结果,对于上面那个图,还有一种排序结果就是1 2 3 5 4。为了可以进行拓扑排序,给定的图中不可以有环。我们可以简单论原创 2020-07-18 20:02:44 · 272 阅读 · 0 评论 -
BFS_or_DFS_785_判断二分图
文章目录题目描述解析题目描述解析用一个字典表示分组情况,一组value为True,另一组为False若已经为True的组 也应该为False (奇数个节点组成的环)则返回 False孤立节点 可以属于任意一组,故可以忽略图可能非连通,即存在多个连通子图,代码里是用 for循环遍历的下标,即遍历多个连通子图(若存在)BFSimport collectionsfrom typing import Listclass Solution: def isBiparti原创 2020-07-16 17:30:35 · 168 阅读 · 0 评论 -
dp_hard_1510石子游戏IV
文章目录题目描述解析 - 博弈论中的必胜态和必败态题目描述Alice 和 Bob 两个人轮流玩一个游戏,Alice 先手。一开始,有 n 个石子堆在一起。每个人轮流操作,正在操作的玩家可以从石子堆里拿走 任意 非零 平方数 个石子。如果石子堆里没有石子了,则无法操作的玩家输掉游戏。给你正整数 n ,且已知两个人都采取最优策略。如果 Alice 会赢得比赛,那么返回 True ,否则返回 False 。示例 1:输入:n = 1输出:true解释:Alice 拿走 1 个石子并赢得胜利,原创 2020-07-15 01:10:45 · 400 阅读 · 0 评论 -
BFS_or_Djiskra+优先队列_5211_ 概率最大的路径 - 197场周赛第3题
文章目录题目描述思路方法1 - BFS法2 - Dijkstra+优先队列Reference题目描述思路方法1 - BFS关键点是: 当我们遍历到一个节点时,如果节点没有遍历过,那么可以继续遍历;如果遍历过节点,但是上次遍历时的概率比当先小,这个时候是需要重复遍历的(其实是贪心算法)class Solution: def maxProbability(self, n: int, edges: List[List[int]], succProb: List[float], start原创 2020-07-13 03:50:29 · 176 阅读 · 0 评论 -
记忆化递归_or_DP_Hard_10_正则表达式匹配
文章目录题目描述思路方法一:DP方法二:递归题目描述思路方法一:DPReference注意特判:s="",p="a*b*" 需要返回Trueclass Solution: def isMatch(self, s: str, p: str) -> bool: m, n = len(s)+1, len(p)+1 # row, column dp = [[0]*n for _ in range(m)] dp[0][0] = 1原创 2020-06-20 16:54:35 · 178 阅读 · 0 评论 -
二分_medium_1428_至少有一个 1 的最左端列
文章目录题目描述思路题目描述思路二分# """# This is BinaryMatrix's API interface.# You should not implement it, or speculate about its implementation# """#class BinaryMatrix(object):# def get(self, row: int, col: int) -> int:# def dimensions(self) ->原创 2020-06-18 14:50:39 · 187 阅读 · 0 评论 -
栈_Hard_1028_从先序遍历还原二叉树
文章目录题目描述思路题目描述思路虽说标签是hard类型的,但是题目不难具体思路如下:节点树为 1~1000,可以判定首节点一定存在首先提取出root节点,和深度一起拼成tuple,放到一个队列中 (数组也行)然后遍历剩余节点,统计其深度 和 数值 (深度用-表示)然后 遍历到的剩余节点的深度 和 队列中最后一个节点的深度 只有 大于、等于 和 小于 3 种情况。如果是大于,只可能深度比前者大1如果是小于,那可能小任意值,这里用循环pop出队列中深度不等的node代码如下:#原创 2020-06-18 13:59:26 · 155 阅读 · 0 评论 -
二分_1300_转变数组后最接近目标值的数组和
文章目录题目描述题目描述原创 2020-06-17 21:45:28 · 135 阅读 · 0 评论 -
单调栈_ 739_每日温度
文章目录题目描述思路题目描述思路单调栈 - 栈中存放数组元素的下标class Solution: def dailyTemperatures(self, T: List[int]) -> List[int]: stack = [] res = [0] * len(T) for i in range(len(T)): if not stack or T[i] <= T[stack[-1]]: # 栈空原创 2020-06-11 00:38:08 · 244 阅读 · 0 评论 -
Union-find_990_等式方程的可满足性
文章目录题目描述思路题目描述思路union-find:由于返回False主要是在对之前等号传递关系的矛盾性描述,故需要先遍历"=="关系,这里代码将 原元素重组了一下class Solution: def equationsPossible(self, equations: List[str]) -> bool: data = collections.defaultdict() def find_root(a): retu原创 2020-06-08 10:25:29 · 183 阅读 · 0 评论 -
DFS_366_寻找二叉树的叶子节点
文章目录题目描述思路题目描述思路反向记录 层的深度,即叶子结点记为0用Hash Map 记录每层的数据# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def findLeaves(se原创 2020-06-06 16:48:05 · 529 阅读 · 0 评论 -
DFS_298_二叉树最长连续序列
文章目录题目描述思路题目描述思路dfs,若在递归过程中 不满足要求,长度重新置为1# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def longestConsecutive(se原创 2020-06-06 16:42:24 · 241 阅读 · 0 评论 -
BFS_&DFS_314_二叉树的垂直遍历
文章目录题目描述思路题目描述思路垂直方向按 level 划分,root的level为0,往左 自减1 往右自增 1BFS 会按从上到下的顺序记录下 垂直方向的顺序,然后再用一个字典存储 垂直方向的数据即可(在遍历时垂直方向已经有序)DFS 在遍历时并不能保证垂直方向是有序的,可以额外加一个字段,用来标记遍历的数据的层数。( - 那为啥不直接用BFS层序遍历? - 因为我想练习DFS -_-# )BFS# Definition for a binary tree no原创 2020-06-06 14:29:27 · 270 阅读 · 0 评论 -
DFS_694_不同岛屿的数量
文章目录题目描述思路题目描述思路难点是怎么两个岛屿是相同的这里一种方法是:岛屿左上角的那个坐标设为(x, y),然后岛屿内的每个元素都减去这个值,存成集合来判断两个集合是否相等class Solution: def numDistinctIslands(self, grid: List[List[int]]) -> int: directions = [[-1, 0], [0, -1], [1, 0], [0, 1]] def dfs(x,原创 2020-06-04 19:10:33 · 245 阅读 · 0 评论 -
单调栈_hard_84_柱状图中最大的矩形
文章目录题目描述思路方法一:递归 -- 超时 Time:O(n^2)方法二:单调栈单调栈 + 哨兵 优化题目描述思路方法一:递归 – 超时 Time:O(n^2)在数组[0, len(heights)] 找到最小值,假设下标为index,然后计算以该最小值为高度的,左右最大扩展为宽度的面积然后 递归左右两边[0, index-1], [index+1, len(heights)]TimeO(n2)Time O(n^2)TimeO(n2) – 超时class Solution:原创 2020-05-30 01:46:33 · 225 阅读 · 0 评论 -
递归_or_栈_medium_394_字符串解码
文章目录题目描述思路解法一:辅助栈题目描述思路解法一:辅助栈本题难点在于括号内嵌套括号,需要从内向外生成与拼接字符串,这与栈的先入后出特性对应。算法流程:构建辅助栈 stack, 遍历字符串 s 中每个字符 c;当 c 为数字时,将数字字符转化为数字 multi,用于后续倍数计算;当 c 为字母时,在 res 尾部添加 c;当 c 为 [ 时,将当前 multi 和 res 入栈,并分别置空置 00:记录此 [ 前的临时结果 res 至栈,用于发现对应 ] 后的拼接操作原创 2020-05-28 15:21:25 · 126 阅读 · 0 评论 -
哈希表+双向链表_146_LRU缓存机制
文章目录题目描述思路题目描述思路用一个双向链表存储写入的数据信息,链表中的node有两个值,key和 value定义一个字典(哈希表),key为写入数据中的key,value为node的地址(引用),这样可以O(1)O(1)O(1) 的时间在双向链表中找到对应的node。链表中最新的元素放在最前面,若容量已满,则删除链表最后元素。每次命中时,都需要重新移动节点到最前。整体的时间复杂度 为 O(1)O(1)O(1),Space 为 O(capacity)O(capacity)O(capacit原创 2020-05-25 15:56:48 · 262 阅读 · 0 评论 -
DP_两个子序列的最大点积
文章目录题目描述思路题目描述思路定义dp[i][j]的含义是到nums1[i-1]和nums2[j-1]为止的子序列的最大点积。则:其中dp[i][j] 的值 有5种选择,(1)只选择nums1[i-1]和nums2[j-1],即 dp[i][j] = nums1[i-1]* nums2[j-1](2)选择nums1[i-1],不选择nums2[j-1],即 dp[i][j] = dp[i][j-1](3)不选择nums1[i-1],选择nums2[j-1],即 dp[i][j] = dp原创 2020-05-24 17:41:06 · 236 阅读 · 0 评论 -
回溯_or_位运算_二叉树中的伪回文路径
文章目录题目描述思路解法一: 回溯解法二:位运算题目描述思路解法一: 回溯用一个字典统计遍历到的节点的值{key为node.val: value为node.val出现的次数},遍历到跟节点之后,判断字典中奇数value出现的次数,若小于等于1次,说明可以构成回文。注意:该方法每次遍历到叶节点时,需要回溯,删去非此分支上的节点值。# Definition for a binary tree node.# class TreeNode:# def __init__(self, va原创 2020-05-24 14:13:01 · 196 阅读 · 0 评论 -
状压DP_hard_1434_每个人戴不同帽子的方案数
文章目录题目描述思路解法一:状压DP :Time O(mn2^n)方法二:状压+dfs题目描述思路解法一:状压DP :Time O(mn2^n)Reference其中 m为 帽子数量,这里是40,n是人数class Solution: def numberWays(self, hats: List[List[int]]) -> int: # 让人戴帽子的嵌套列表 -> 把帽子送人的字典 d = {k: set() for k in ran原创 2020-05-18 21:20:28 · 249 阅读 · 0 评论 -
贪心_hard_1453_圆形靶内的最大飞镖数量_第189场周赛
文章目录题记题目描述思路代码 -- Time:O(n3)O(n^3)O(n3)题记第189场周赛最后一题,没做出来。贴一下排名,再接再厉。题目描述思路任选两个点,假设这两个点在半径为r的圆上,然后确定该圆,再贪心的统计在圆内的最多的点的数量即可。由于给定半径r, 两个点在圆上的圆(若存在)有两个,这里不用分别计算该两个圆,因为在两层循环遍历的时候,a,b求完一个,下次遍历b,a的时候会求另外一个圆。证明上述正确性:直观图如下代码 – Time:O(n3)O(n^3)O原创 2020-05-18 18:25:00 · 232 阅读 · 0 评论 -
DP_medium_152_乘积最大子数组
文章目录题目描述思路方法一: 暴力 - 时间复杂度O(n)O(n)O(n)方法二: DP - 时间复杂度O(n)O(n)O(n)题目描述思路方法一: 暴力 - 时间复杂度O(n)O(n)O(n)0在数组中是个特殊元素,因为任何元素和0相乘都为0,(DP思路没写出来时)我想着以0 为切分点,将原数组切分成一些子数组,这些子数组中不包含0,然后单考虑所有的子数组:若子数组中不含负数,或者包含偶数个负数,那么该子数组的最大值就是 所有元素的乘积若子数组中含有奇数个负数,易证:该子数组的最大值是 最原创 2020-05-18 17:57:11 · 190 阅读 · 0 评论 -
拓扑排序_210_课程表II
文章目录题目描述思路DFSBFS题目描述思路DFSfrom typing import Listimport collectionsclass Solution: def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]: # 存储有向图 edges = collections.defaultdict(list) # 标记每个节原创 2020-05-17 01:23:35 · 161 阅读 · 0 评论 -
递归_medium_50_Pow(x, n)
文章目录题目描述思路:转成二进制解法递归解法迭代解法题目描述思路:类似转成二进制的方法,比如求 3 的 15 次方,即315=31+2+4+8=31∗32∗34∗383^{15} = 3^{1+2+4+8} = 3^1*3^2*3^4*3^8315=31+2+4+8=31∗32∗34∗38,10转成二进制为1111这样我们在计算时就可以利用上次的结果,计算过程类似二分。时间复杂度 O(logn)O(logn)O(logn),空间复杂度 O(1)O(1)O(1)转成二进制解法class S原创 2020-05-11 09:38:50 · 164 阅读 · 0 评论 -
DFS_medium_5406_收集树上所有苹果的最少时间
文章目录题目描述思路方法一:DFS方法二:类似于Union-Find方法题目描述思路方法一:DFSdef minTime(n: int, edges: List[List[int]], hasApple: List[bool]) -> int: data_dict = {} for i in range(n): data_dict[i] = [] for one in edges: data_dict[one[0]].append(one[1]) # p原创 2020-05-10 18:03:39 · 202 阅读 · 0 评论 -
递归or存储父节点_236_二叉树的最近公共祖先
文章目录题目描述题目描述原创 2020-05-10 13:50:20 · 183 阅读 · 0 评论 -
分治法_medium_439_三元表达式解析器
文章目录题目描述思路题目描述给定一个以字符串表示的任意嵌套的三元表达式,计算表达式的值。你可以假定给定的表达式始终都是有效的并且只包含数字 0-9, ?, :, T 和 F (T和 F 分别表示真和假)。注意:给定的字符串长度 ≤ 10000。所包含的数字都只有一位数。条件表达式从右至左结合(和大多数程序设计语言类似)。条件是 T 和 F其一,即条件永远不会是数字。表达式的结果是...原创 2020-05-07 00:42:43 · 214 阅读 · 0 评论 -
动态规划_medium_983_最低票价
文章目录题目描述思路这里用迭代正向遍历递归解法递归解法 2题目描述在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。火车票有三种不同的销售方式:一张为期一天的通行证售价为 costs[0] 美元;一张为期七天的通行证售价为 costs[1] 美元;一张为期三十天的通行...原创 2020-05-06 23:20:44 · 151 阅读 · 0 评论 -
动态规划_medium_1230_抛掷硬币
文章目录题目描述思路题目描述有一些不规则的硬币。在这些硬币中,prob[i] 表示第 i 枚硬币正面朝上的概率。请对每一枚硬币抛掷 一次,然后返回正面朝上的硬币数等于 target 的概率。示例 1:输入:prob = [0.4], target = 1输出:0.40000示例 2:输入:prob = [0.5,0.5,0.5,0.5,0.5], target = 0输出:...原创 2020-05-04 23:42:49 · 358 阅读 · 0 评论 -
双指针+双单调队列或堆_5402_绝对差不超过限制的最长连续子数组
文章目录题目描述解题思路题目描述给你一个整数数组nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于limit。如果不存在满足条件的子数组,则返回0 。示例 1:输入:nums = [8,2,4,7], limit = 4输出:2 解题思路left、right 双指针,指向遍历到的数组下标。nums 数...原创 2020-05-03 19:25:20 · 277 阅读 · 0 评论 -
LeetCode 刷题指北 考点汇总
LeetCode原创 2020-05-03 18:50:26 · 307 阅读 · 0 评论 -
计数排序
文章目录算法过程演示示例代码示例算法分析Reference计数排序是一种非比较性质的排序算法,元素从未排序状态变为已排序状态的过程,是由额外空间的辅助和元素本身的值决定的。计数排序过程中不存在元素之间的比较和交换操作,根据元素本身的值,将每个元素出现的次数记录到辅助空间后,通过对辅助空间内数据的计算,即可确定每一个元素最终的位置。比较性质排序算法的时间复杂度有一个理论边界,即 O(Nlog2...原创 2020-02-09 02:46:04 · 119 阅读 · 0 评论 -
LeetCode1043:Partition Array for Maximum Sum 分隔数组以得到最大和(DP)
文章目录动态规划问题求解的条件:最优解的表示;状态转移方程;边界条件判断。编程实现(参考的别人的代码):动态规划问题求解的条件:最优解的表示;状态转移方程;边界条件判断。对于此问题:1.最优解表示:res[i] 表示 A[0:i]的最优划分对应的值和(res[len(A)]即最终结果);2.状态转移方程:res[i]=res[i−len(lastSubA)]+max(lastSubA)...原创 2019-12-29 22:16:59 · 189 阅读 · 0 评论