- 博客(112)
- 收藏
- 关注
原创 【LeetCode】712 and 344(动态规划 and 双指针)
712. 两个字符串的最小ASCII删除和dp[i][j]代表s1[:i]和s2[:j]的最小删除和s1和s2的长度为m和n,dp的行列数需要额外加一(dp[m+1][n+1]),用于表示s1或者s2为空的情况。在创建DP后先填充0行和0列,因为另一个字符(假设是s1)为空,所以当前位置的删除和为s2[:j]的所有字符的总和随后开始遍历dp,如果遇到的字符相等,那么当前的删除和为去掉s[i-1]和s[j-1]的删除和,即dp[i][j] = dp[i - 1][j - 1]如果遇到的字符不等,那么
2022-03-15 10:48:30
594
1
原创 【LeetCode】583 and 599(动态规划+哈希表)
583. 两个字符串的删除操作解法:最长公共子序列可以参考之前的代码求得最长公共子序列的长度,再分别用两个字符串的长度减掉子序列的长度,再求和即为结果。class Solution: def minDistance(self, word1: str, word2: str) -> int: m, n = len(word1), len(word2) dp = [[0] * (n + 1) for _ in range(m + 1)] fo
2022-03-14 09:45:02
325
原创 【LeetCode】53 and 1143(动态规划)
53. 最大子数组和解法:动态规划为了寻求dp[i]和dp[i-1]之间的关联,我们定义dp[i]为以nums[i]为边界的最大连续子数组和。这样我们能够得到转化方程:dp[i] = max(dp[i-1]+nums[i], nums[i])class Solution: def maxSubArray(self, nums: List[int]) -> int: n = len(nums) dp = [0] * n res = floa
2022-03-13 13:01:06
756
原创 【LeetCode】322 and 509(动态规划1)
动态规划是什么?解决动态规划问题有什么技巧?如何学习动态规划?1. ⾸先,动态规划问题的⼀般形式就是求最值。既然是要求最值,核⼼问题是什么呢?求解动态规划的核⼼问题是穷举。具体而言- 第一,动态规划的穷举有点特别,因为这类问题存在「重叠⼦问题」,如果暴⼒穷举的话效率会极其低下,所以需要「备忘录」或者「DP table」来优化穷举过程,避免不必要的计算。- 第二,动态规划问题⼀定会具备「最优⼦结构」,才能通过⼦问题的最值得到原问题的最值。- 另外,虽然动态规划的核⼼思想就是穷举求最值,但是问题可以千
2022-03-09 12:01:23
176
原创 【LeetCode】773 and 70(BFS 2 and 动态规划)
BFS基础知识核心思想:把⼀些问题抽象成图,从⼀个点开始,向四周开始扩散。⼀般来说,我们写 BFS 算法都是⽤「队列」这种数据结构,每次将⼀个节点周围的所有节点加⼊队列。常⻅场景:问题的本质就是让你在⼀幅「图」中找到从起点start 到终点 target 的最近距离。BFS 相对 DFS 的最主要的区别是:BFS 找到的路径⼀定是最短的,但代价就是空间复杂度可能⽐ DFS ⼤很多。
2022-03-08 13:55:37
149
原创 【LeetCode】111 and 752(广度优先搜索,BFS)
核心思想:把⼀些问题抽象成图,从⼀个点开始,向四周开始扩散。⼀般来说,我们写 BFS 算法都是⽤「队列」这种数据结构,每次将⼀个节点周围的所有节点加⼊队列。常⻅场景:问题的本质就是让你在⼀幅「图」中找到从起点start 到终点 target 的最近距离。BFS 相对 DFS 的最主要的区别是:BFS 找到的路径⼀定是最短的,但代价就是空间复杂度可能⽐ DFS ⼤很多。
2022-03-07 11:00:24
387
原创 【LeetCode】1905 and 67(DFS解决岛屿问题4 and 二进制求和运算)
本文继续从实例出发,熟悉⼆维矩阵的 DFS 代码框架的使用。同时探讨二进制求和相关问题。
2022-03-06 14:50:03
457
原创 【LeetCode】1020 and 521(DFS解决岛屿问题3 and 脑筋急转弯)
本文继续从实例出发,熟悉⼆维矩阵的 DFS 代码框架的使用。
2022-03-05 10:05:31
150
原创 【LeetCode】1254 and 141(DFS解决岛屿问题2 and 快慢指针)
本文继续从实例出发,熟悉⼆维矩阵的 DFS 代码框架的使用。同时通过实例复习使用快慢指针对链表进行环检测的问题。
2022-03-04 10:58:57
389
原创 【LeetCode】200 and 258(DFS解决岛屿问题)
岛屿系列题⽬的核⼼考点就是⽤ DFS/BFS 算法遍历⼆维数组。那么如何在⼆维矩阵中使⽤ DFS 搜索呢?如果你把⼆维矩阵中的每⼀个位置看做⼀个节点,这个节点的上下左右四个位置就是相邻节点,那么整个矩阵就可以抽象成⼀幅⽹状的「图」结构。
2022-03-03 15:09:55
464
原创 【LeetCode】77 and 78(回溯算法4)
今天就来聊三道考察频率高,而且容易让人搞混的算法问题,分别是求子集(subset),求排列(permutation),求组合(combination)。这几个问题都可以用回溯算法解决。
2022-03-02 15:42:51
301
原创 【LeetCode】698 and 58(回溯算法3)
回溯算法的技巧也不难,前⽂ 回溯算法框架套路 说过,回溯算法就是穷举⼀棵决策树的过程,只要在递归之前「做选择」,在递归之后「撤销选择」就⾏了。但是,就算暴⼒穷举,不同的思路也有优劣之分。本⽂就来看⼀道⾮常经典的回溯算法问题,⼦集划分问题,可以帮你更深刻理解回溯算法的思维。
2022-03-01 02:30:38
164
原创 【LeetCode】51 and 100(回溯算法)
回溯算法其实就是我们常说的 DFS 算法,本质上就是⼀种暴⼒穷举算法。解决⼀个回溯问题,实际上就是⼀个决策树的遍历过程。你只需要思考3 个问题:1、路径:也就是已经做出的选择。2、选择列表:也就是你当前可以做的选择。3、结束条件:也就是到达决策树底层,⽆法再做选择的条件。
2022-02-28 10:18:50
251
原创 【LeetCode】46 and 112(回溯算法)
回溯算法其实就是我们常说的 DFS 算法,本质上就是⼀种暴⼒穷举算法。解决⼀个回溯问题,实际上就是⼀个决策树的遍历过程。你只需要思考3 个问题:1、路径:也就是已经做出的选择。2、选择列表:也就是你当前可以做的选择。3、结束条件:也就是到达决策树底层,⽆法再做选择的条件。
2022-02-28 01:52:01
481
原创 【LeetCode】102 and 2016(二叉树的层序遍历)
层序遍历——给定一个二叉树,返回其按层序遍历得到的节点值。 层序遍历即逐层地、从左到右访问所有结点。什么是层序遍历呢?简单来说,层序遍历就是把二叉树分层,然后每一层从左到右遍历。
2022-02-26 14:13:12
288
原创 【LeetCode】1514 and 191(Dijkstra 算法应用,最小路径算法。二进制运算)
如果我只想计算起点 start 到某⼀个终点 end 的最短路径,是否可以修改Dijkstra 算法框架,提升⼀些效率?
2022-02-25 12:36:32
848
原创 【LeetCode】1631 and 145(Dijkstra 算法应用,最小路径算法)
本文将从具体实例出发,介绍Dijkstra 算法的应用场景。
2022-02-24 13:05:47
199
原创 【LeetCode】743 and 917(Dijkstra 算法,最小路径算法)
Dijkstra 算法,是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。
2022-02-23 16:42:42
634
原创 【LeetCode】1584 and 144(Kruskal 最⼩⽣成树算法)
「树」和「图」最大的区别就是树不会包含环,而图可以包含环。换句话说,树就是「无环连通图」。那么什么是图的「⽣成树」呢,其实按字⾯意思也好理解,就是在图中找⼀棵包含图中的所有节点的树。专业点说,⽣成树是含有图中所有顶点的「⽆环连通⼦图」。
2022-02-22 23:30:40
1006
原创 【LeetCode】990 and 94(Union-Find算法详解,并查集算法)
Union-Find 算法,也就是常说的并查集算法,主要是解决图论中「动态连通性」问题的。
2022-02-21 20:57:45
470
原创 稀疏矩阵的常用存储格式(COO、CSR、CSC)
图是用于描述对象间关系的基本结构,顶点表示对象,边表示连接关系。根据连接关系的紧密可以将图分为稀疏图和稠密图,两者是相对的概念,并不存在明确的划分界限。稀疏图可以理解为仅有少部分对象间存在关联,稠密图反之。实际应用中的图往往都是稀疏图。采用直观的办法来存储图往往会造成极大的空间浪费,如邻接矩阵(稀疏图对应的邻接矩阵中绝大部分的元素为零,无实际意义)。因此需要考虑寻求其它格式来进行高效存储。
2022-02-20 20:54:42
19005
4
原创 【LeetCode】785 and 886(图论基础,二分图的判定)
⼆分图的顶点集可分割为两个互不相交的⼦集,图中每条边依附的两个顶点都分属于这两个⼦集,且两个⼦集内的顶点不相邻。(实质为能否两种颜⾊将图中的所有顶点着⾊,且使得任意⼀条边的两个端点的颜⾊都不相同。即图的「双色问题」)
2022-02-20 14:57:06
317
原创 【LeetCode】207 and 210(图论,有向图的环检测和拓扑排序)
除 「遍历 + 访问」 这两种数据结构相关的基本算法外。图这种数据结构还有⼀些⽐较特殊的算法,⽐如⼆分图判断,有环图⽆环图的判断,拓扑排序,以及最经典的最⼩⽣成树,单源最短路径问题,更难的就是类似⽹络流这样的问题。本⽂就结合具体的算法题,来说两个图论算法:有向图的环检测、拓扑排序算法。
2022-02-19 20:42:12
812
原创 【LeetCode】450 and 98(二叉搜索树的删除和验证)
「二叉搜索树的查找与插入」续篇之「二叉搜索树的删除和验证」本文通过两个实例来介绍如何用二叉搜索树的特性来实现 「删除」和「验证」 操作。
2022-02-12 18:21:06
548
原创 【LeetCode】700 and 701(二叉搜索树的查找和插入)
二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。BST 的基础操作:判断 BST 的合法性、增、删、查。本文通过两个实例来介绍如何用二叉搜索树的特性来实现 「搜索」和「增加」 操作。
2022-02-11 23:16:20
448
原创 【LeetCode】230 and 538(二叉搜索树)
二叉搜索树(BST)的特性:1、对于 BST 的每⼀个节点 node,左⼦树节点的值都⽐ node 的值要⼩,右⼦树节点的值都⽐ node 的值⼤。2、对于 BST 的每⼀个节点 node,它的左侧⼦树和右侧⼦树都是 BST。
2022-02-10 21:38:43
1034
原创 【LeetCode】1372 and 1342(后序遍历的适用场景)
### 后续遍历框架的适用场景很简单的思路,如果当前节点要做的事情需要通过左右⼦树的计算结果推导出来,就要⽤到后序遍历。
2022-01-28 22:51:18
739
2
原创 【LeetCode】297 and 884(二叉树的序列化与反序列化)
序列化和反序列化的目的JSON 的运⽤⾮常⼴泛,⽐如我们经常将变成语⾔中的结构体序列化成 JSON 字符串,存⼊缓存或者通过⽹络发送给远端服务,消费者接受 JSON 字符串然后进⾏反序列化,就可以得到原始数据了。上述内容就是「序列化」和「反序列化」的⽬的,以**某种固定格式组织字符串**,使得**数据可以独⽴于编程语⾔**。
2022-01-27 23:47:17
214
原创 【matplotlib】如何修改子图中的xtick?
有两种方法:使用子图对象的轴方法(例如ax.set_xticks和ax.set_xticklabels)使用plt.sca设置pyplot状态机的当前轴(即plt接口)。作为示例(这也说明了使用setp来更改所有子图的属性):import matplotlib.pyplot as pltfig, axes = plt.subplots(nrows=3, ncols=4)# Set the ticks and ticklabels for all axesplt.setp(axes, x
2022-01-26 23:46:02
4921
2
原创 【LeetCode】652 and 1365(二叉树基础思想之递归算法3)
该题为我们对二叉树遍历框架使用中明确【什么时候做】提供学习参考。具体有关二叉树遍历框架可参考二叉树遍历框架652. 寻找重复的子树解法:递归+遍历框架依旧是同样的求解思路,明确「该做什么」和「什么时候做」:「该做什么」对于每个节点,需要描述以其为根节点的树内容。「什么时候做」先得到左子树的描述,再得到右子树的描述,再加上根节点。因此是后序遍历。在这里,对子树的描述可以采用二叉树的序列化表示,即利用二叉树的前序/中序/后序遍历结果来描述二叉树的结构。我们用非数字的特殊符#表示空指针,并且
2022-01-26 11:29:59
343
原创 【LeetCode】654 and 1688(二叉树基础思想之递归算法2)
本篇文章内容为二叉树基础思想之递归算法1的延伸,有关其具体原理可参考链接下文章内容。654. 最大二叉树解法:递归「该做什么」:找到当前数组(树)的最大值及其索引。「什么时候做」:需先找到最大值索引,最大值索引左侧元素为其左子树,右侧元素为其右子树。因此是前序遍历框架。# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):#
2022-01-25 11:36:10
144
原创 【LeetCode】226、116 and 114(二叉树基础思想之递归算法)
树的任何相关问题都离不开以下遍历框架:该框架应用十分广泛,例如只要涉及递归相关问题,都可以抽象成二叉树问题,其求解离不开上述框架的使用。解决树相关的递归问题,其核心步骤为:先搞清楚当前 root 节点「该做什么」以及「什么时候做」,然后根据函数定义递归调⽤⼦节点,递归调⽤会让孩⼦节点做相同的事情。「该做什么」就是让你想清楚写什么代码能够实现题⽬想要的效果。「什么时候做」,就是让你思考这段代码到底应该写在前序、中序还是后序遍历的代码位置上。接下来我会用上述步骤对LeetCode中226、11
2022-01-24 22:51:21
483
2
原创 【LeetCode】380 and 710(常数时间查找/删除数组内任意元素)
380. O(1) 时间插入、删除和获取随机元素解法:哈希表+动态数组该题实现的关键点:1、插⼊,删除,获取随机元素这三个操作的时间复杂度必须都是 O(1)。2、getRandom ⽅法返回的元素必须等概率返回随机元素,也就是说,如果集合⾥⾯有 n 个元素,每个元素被返回的概率必须是 1/n。分析如下:哈希表等数据结构能够实现常数时间内插入、删除,但是不能实现常数时间内等概率返回。数组能实现常数时间内等概率返回,但是不能实现常数时间内删除。因此考虑将这两者结合,构建动态数组以及value
2022-01-23 23:10:42
300
原创 【LeetCode】460 and 1132(LFU缓存机制)
LRU 算法的淘汰策略是 Least Recently Used,也就是每次淘汰那些最久没被使⽤的数据;⽽ LFU 算法的淘汰策略是 Least Frequently Used,也就是每次淘汰那些使⽤次数最少的数据。460. LFU缓存解法:哈希链表LFU和LRU的主要区别在于缓存淘汰机制不同,前者是淘汰使用频率最低的数据,后者是淘汰最早使用的数据。原先LRU算法的核心内容哈希链表,只能解决时序问题,无法解决频率信息。因此需要重新进行设计,实现LFU算法需要满足以下几个条件:1、调⽤ get(
2022-01-22 10:18:42
436
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人