leetcode
okikka
这个作者很懒,什么都没留下…
展开
-
Leetcode 98. 验证二叉搜索树 / python实现
文章目录*题目*在这里插入图片描述*代码实现*题目代码实现"""解法1:利用二叉树的性质:中序遍历的结果为升序序列(无重复数字的)"""class Solution: def isValidBST(self, root: TreeNode) -> bool: r = [] def order(root): if not root: return order(root.l原创 2021-04-16 20:07:26 · 161 阅读 · 0 评论 -
Leetcode 139. 单词拆分 / 动态规划 / python实现
文章目录*题目**代码实现*题目注意:输入:s = “cars”, wordDict = [“car”,“ca”,“rs”]输出:true解释:"cars"可以拆分为“ca”、“rs”代码实现(动态规划一看就会,一写就废????)class Solution: def wordBreak(self, s: str, wordDict) -> bool: # dp[i]表示截止到第i个元素(不包括i)能否分割为wordDict dp = [F原创 2021-04-15 20:45:25 · 151 阅读 · 0 评论 -
关键路径(求解)知识点
简介源点:图中有且仅有一个入度为0的点称为源点汇点:图中有且仅有一个出度为0的点成为汇点关键路径:从源点开始到汇点结束的且有最大路径长度的路径事件最早开始事件:源点开始时间为0某事件多条路径重合时候,选择时间大的事件最迟开始事件:倒推,从汇点向源点推导汇点最迟开始时间 = 最早开始时间某事件多条路径重合时候,选择时间小的活动最早开始时间:与活动起点的最早开始时间相同活动最迟开始时间:等于该活动终点的最迟开始时间 - 活动持续时间其中关键路径由-活动最迟与最早开始时间重叠原创 2020-09-08 17:17:00 · 1012 阅读 · 0 评论 -
狄克斯特拉算法 / 带权图的最短路径 / python实现
简述狄克斯特拉算法用于找到带权图中,某点到其他各点的最短路径(BFS用于找出无权图中的最短路径)只适用于有向无环图无负权重图,因为狄克斯特拉算法在处理节点时候采用贪心思想,即某节点一旦被处理了,就说明不存在到达该节点更小开销的路径(存在负权重可以采用贝尔曼·福德算法)"""贝尔曼·福德算法1) 初始化时起点到其他点的距离为对应权重,无法直接到达的点则初始化为∞2) 起点到自身的距离为0 (D[起点] = 0)3) 对每条边进行v-1次松弛(v为节点个数)"""for i in r原创 2020-09-07 11:37:15 · 996 阅读 · 0 评论 -
二叉树 - 某节点到其左右子树中叶子结点的距离 / Leetcode 1530. 好叶子节点对的数量
# 获取当前节点左右子树中叶子节点到该点的距离 def DFS(root): if not root: return {} if not root.left and not root.right: return {root: 0} left_leaf = DFS(root.left) right_leaf = DFS...原创 2020-08-28 21:22:13 · 212 阅读 · 0 评论 -
Leetcode 最大化最小值问题总结 / python实现
文章目录*题目**解题思路**代码实现*题目该类型的题目5489. 两球之间的磁力410. 分割数组的最大值LCP 12. 小张刷题计划(410变体,这个才应该是困难吧????)875. 爱吃香蕉的珂珂解题思路最大化最小值 / 最小化最大值 都是采用二分方法,只是二分过程中一旦某个值满足条件后,移动方向的不同,最大化最小值是放大左端的值,最小化最大值是缩小右端的值。这类题目(根据目前见到的)一般是将数组划分为m个连续的子数组。或者题目中已经提及了最大化最小值这种关键词。代码实现原创 2020-08-16 17:43:36 · 1482 阅读 · 0 评论 -
Leetcode 698. 划分为k个相等的子集 / 416. 分割等和子集 / 划分总和相同的子集 / python实现
文章目录*题目**解题思路**代码实现*题目解题思路题416是题698(k=2时)的特例。划分为k个相等的子集的思路:直接DFS判断是否能够划分成为k个子集,重点在于剪枝,即需要将数组从大到小进行排序。为什么不是从小到大排序?也是可以的,但是(在测试用例中)从大到小可以减少回溯的次数,大值+大值+… >= 目标值的几率更大。当只划分为了两个集合时,可以直接套用上面划分为k个相等子集的代码,也可以利用01背包动态规划。动态规划思路:只要当前数组中能填充背包容量为sum(nums) /原创 2020-08-12 18:24:55 · 801 阅读 · 0 评论 -
Leetcode 207. 课程表 / 判断有(无)向图是否存在环路 / python实现
文章目录*题目**解题思路**代码实现*题目解题思路拓扑排序首先记录所有点的出入度情况,将所有入度为0的点加入队列中,当队列不为空的时候,每次取出队首的点,遍历其邻接点,使得每一个邻接点的入度-1。如果所有曾在队列中的点等于课程数量,说明不存在环路。DFS,通过记录状态来判断是否存在环路。代码实现"""拓扑排序1. 将所有入度为0的节点入队列2. 每次从队列取出一个节点,并将这个节点的所有临界点的入度-13. 判断已经处理过的节点是否和课程数量相同"""from col原创 2020-08-05 22:04:51 · 770 阅读 · 0 评论 -
Leetcode 350. 两个数组的交集 II / python实现
文章目录*题目**解题思路**代码实现*题目解题思路只想到复杂度相当高的动态规划(和最长公共子序列的做法几乎一致)和暴力(;′⌒`)。排序再使用双指针很妙,哈希表的实现和双重循环思路其实是类似的。代码实现"""哈希表"""from collections import Counterclass Solution: def intersect(self, nums1, nums2): nums1 = Counter(nums1) res = []原创 2020-07-13 18:10:07 · 201 阅读 · 0 评论 -
Leetcode 1414. 和为 K 的最少斐波那契数字数目 / python实现
文章目录*题目**解题思路**代码实现*题目解题思路因为一定存在解,使用贪心。先构建斐波那契数列,因为k≤10^9,所以数组长度只有四十左右,每次在斐波那契数列中选取≤当前k的值,循环直至当前k能在斐波那契数列中找到。(具体的数学证明题解区讲的很详细)代码实现class Solution: def findMinFibonacciNumbers(self, k: int) -> int: nums = [1, 1] # 构建斐波那契数列原创 2020-07-12 19:57:50 · 237 阅读 · 0 评论 -
Leetcode 386. 字典序排数 / python实现
文章目录*题目**解题思路**代码实现*题目解题思路DFS1-9的数字可以构建九颗树,字典序相当于顺序的对每一颗树进行前序遍历。每个节点下一层的元素就是当前数值后面加上[0, 9]的数值,eg:1的下一层就是 10、11、12…19自带排序库代码实现DFSclass Solution: def lexicalOrder(self, n: int): self.res = [] def DFS(i): i = int(原创 2020-07-06 08:41:59 · 250 阅读 · 0 评论 -
Leetcode 525. 连续数组 / 01数组前缀和
文章目录*题目**解题思路**代码实现*题目解题思路第一反映是前缀和,但是双重循环超时了。看到评论区的思路是将0看作是-1,虽然仍然是前缀和的思想,但是前缀和数组从非降序变为了有正有负,所以一次遍历即可。利用哈希表每次记录第一次遇到的前缀和所对应的下标,如果遇到同一个前缀和两次,就说明两个前缀和之间的区间中0、1个数是相等的(因为两者前缀和相减为0)初始化时候,map[0] = -1,这样就保证了如果[0, i]区间中的数值已经满足了要求,其长度也会被记录进去代码实现from collec原创 2020-06-28 19:38:01 · 245 阅读 · 0 评论 -
Leetcode 41. 缺失的第一个正数 / 利用数组本身充当哈希表
文章目录*题目**解题思路**代码实现*题目解题思路题目相当于:找出[1, 数组长度+1]中最小的且没有在数组中出现过的元素。利用数组本身充当哈希表:将1放在下标为0处,2放在下标为1处…这样保证如果数值在[1, 数组长度+1]范围内的,都在其对应的位置上,一旦某下标i处对应元素不是i+1,就说明数组中缺失了i+1这个元素。代码实现基本注释版本class Solution: def firstMissingPositive(self, nums: List[int]) ->原创 2020-06-27 19:06:43 · 125 阅读 · 0 评论 -
Leetcode 1367. 二叉树中的列表 / 面试题 04.10. 检查子树 / 判断子树问题
文章目录*题目**解题思路**代码实现*题目解题思路面试题04.10 - 标准的检查子树问题:遍历大的一颗树,一旦发现了和小树(待检测子树)根节点相同的结点,再来判断两者的左子树和右子树是否相等,可以发现这是一个递归的过程。二叉树中的列表:同样也是遍历树,一旦发现和链表头数值相同的结点,再来判断该树的下一层,其左右结点中是否有链表下一个结点数值,如果有,再判断子节点的子节点中是否有下下一个结点的数值,仍然是一个递归的过程。和标准子树问题不同,一旦找到可能的结点,只要其子节点中有一个原创 2020-06-26 19:00:36 · 200 阅读 · 0 评论 -
Leetcode 1405. 最长快乐字符串 / 984. 不含 AAA 或 BBB 的字符串 / python实现
文章目录*题目**解题思路**代码实现*题目同一种题型,思路也是相同的解题思路解法一:贪心,每次在都插入当前剩余最多的元素,只有不能继续写入该元素时,才转向另外的元素(仍是剩下中最大的)进行插入。解法二:插入法,以a = 1, b = 2, c = 7为例首先构建基础串=“abc(所有元素)” × 1(最少元素对应的数值)+ “bc”(最少数值字母已经用光了,继续用剩下的字母来构造) × 1(第二少元素剩下的数值),最终的基础串为"abcbc" => 用数值最小到数值第二大对应的字母原创 2020-06-25 18:18:18 · 264 阅读 · 0 评论 -
01背包 / 完全背包笔记
文章目录*前言**代码实现**初始化问题(一维数组)**求方案数(以01背包为例)**背包方案数例题**背包问题在leetcode中的题目*前言观看闫神的背包九讲的一点点笔记代码实现01背包的二维实现// 外层循环是可以选择物品for(int i=1; i<=n; i++){ // 内层循环时背包的容量 for(int v=w[i]; v<=V;v++){ /* dp[i][v]表示前i个元素总容量为v时最大的价值 对于第i个元素只有两种选择:选or不选,原创 2020-06-21 16:27:40 · 184 阅读 · 0 评论 -
Leetcode 435. 无重叠区间 / python实现
文章目录*题目**解题思路**代码实现*题目解题思路要求找到移除的最小数量,如果区间之间发生重叠我们需要移除的就应该为范围更大的一个区间,因为这样的区间与后序(顺序排序下)区间更可能再次发生重叠。如何界定范围更大的区间?完全包含另一个区间的与另一个区间重叠了一部分,同时整体靠后的区间如下图,其中与A发生重叠时候,B、C是我们需要移除的区间,因为更可能和后面的区间再次发生重叠。同时因为需要进行区间的比较,所以要采用全局变量记录当前的最小区间,只有不发生重叠的时候,才更新当前的最小区间。原创 2020-05-10 09:51:44 · 623 阅读 · 1 评论 -
最长公共子序列、最长公共子数组 / 动态规划 / python实现
以1143. 最长公共子序列、718. 最长重复子数组为例题目子序列和子数组子序列:由数组中不连续的元素组成的数组。eg:[1, 2, 3, 4]子序列可为[1, 4]子数组:数组中连续元素组成的数组。eg:[1, 2, 3, 4]子数组可以为[1, 2, 3]代码实现两者的代码非常相似"""最长公共子数组(连续)- 动态规划"""class Solution: ...原创 2020-05-05 20:27:43 · 593 阅读 · 0 评论 -
Leetcode 450. 删除二叉搜索树中的节点 / python实现
文章目录*题目**解题思路**代码实现*题目解题思路删除二叉搜索树中结点分为三种情况:删除结点为叶子结点 - 直接删除结点即可删除结点只有一个子节点 - 用子节点代替被删除结点删除的结点有左右结点· 用左子树的最右结点A(也就是左子树中最大的结点)代替被删除结点,在树中删除结点A。· 用右子树的最左结点B(右子树中最小的结点)代替被删除结点,在树中删除结点B。可以发现当被删...原创 2020-05-02 11:31:48 · 401 阅读 · 0 评论 -
Leetcode 779. 第K个语法符号 / python实现
题目:思路:第一想法是直接构建串,果不其然超时了。先构造几个字符串看看规律,可以发现下一层的字符串=上一层字符串+上一层字符串的每一个取反,第i行的字符串长度为2**i(i从0开始)进一步改进,已知串的构造规律,倒推第N行第K个字符是从哪一个转换过来的。class Solution: def kthGrammar(self, N: int, K: int)...原创 2020-04-16 19:18:13 · 286 阅读 · 0 评论 -
Leetcode 179. 最大数 / python实现
文章目录*题目**解题思路**代码实现*题目解题思路从示例中可以发现就是让我们对数组进行某种排序。很直观的可以发现,相当于对数的每一位进行比较,如果前面位数都相同,数A某一位大于数B的相同位数就表示A应该放在数组的前面,eg:9大于30。难点在于判断只有一位不同的数字,eg:3和30,就采用直接拼接两者,看哪一种组合更大,就知道谁应该在前面,继而将这种思路推广到全部数字的比较。代码...原创 2020-05-01 22:17:15 · 653 阅读 · 0 评论 -
Leetcode 684. 冗余连接 / 最小生成树 - Krustal / python实现
文章目录*题目**解题思路**Krustal算法**代码实现*题目解题思路从题意中可以看出来就是找出无向图中的最小生成树,可以采用prim和krustal。Krustal算法Krustal算法:利用并查集,初始时每个点的祖先都是自身,将每一个点看作是一棵独立的树。(无向图)每次取出一条边,如果两端点的祖先结点不同,则表明是两颗不同的树,合并两棵树(一个点变成另一个点的祖先),处理完整...原创 2020-04-29 09:52:15 · 519 阅读 · 0 评论