LeetCode
闪闪的大海
这个作者很懒,什么都没留下…
展开
-
LeetCode940. 不同的子序列 II(动态规划)
题目:940. 不同的子序列 II题解:官方题解用 dp[k] 表示 s[0 .. k] 可以组成的不同子序列的数目,含空串。如果 k+1 是从未出现的字符,则 dp[k+1] = 2 * dp[k]如果 k+1 的字符最后一次在 i 处出现过,则 dp[k+1] = 2 * dp[k] - dp[i-1]源码:实际编码中,题解中的 dp[k] 对应编码中的 dp[k+1]class Solution: def distinctSubseqII(self, s:原创 2021-08-30 00:25:02 · 188 阅读 · 0 评论 -
LeetCode#295 数据流的中位数(大小顶堆)
题目:295. 数据流的中位数实现一个类,支持addNum和findMedian,求中位数题解:做两个堆,分别存储比中位数小的,比中位数大的插入时间复杂度 O(logN)查找时间复杂度 O(1)源码:400ms,34.1MBimport heapqclass MedianFinder: def __init__(self): """ initialize your data structure here. ""原创 2021-08-29 23:26:30 · 147 阅读 · 0 评论 -
LeetCode5856. 完成任务的最少工作时间段(状态压缩动态规划)
题目:5856. 完成任务的最少工作时间段给出N个任务需要执行的时间,以及执行机构连续工作的时间,输出最少需要执行几次“连续工作”题解:方法一:模拟+剪枝用 S(m) 表示,已安排 0~m 个任务,所有的安排情况(是个集合,集合每个元素,是各session已用时间)在安排 第 m+1 个任务的时候,就在所有安排情况(即集合每个元素)中,尝试所有安排 m+1 的可能性模拟所有可能的情况,时间复杂度为,这是最坏情况采取如下剪枝:1-先安排时间长的任务:开头的时候安排情况可能性就原创 2021-08-29 23:15:35 · 668 阅读 · 0 评论 -
LeetCode5836 到达目的地的方案数(单源最短路+DP)
题目: https://leetcode-cn.com/contest/biweekly-contest-59/problems/number-of-ways-to-arrive-at-destination/有 n 个路口,编号 0 .. n-1某些路口间,有双向道路,为两个路口需要花费的时间求:从路口 0 到路口 n-1,满足最少时间的总的方案数目 题解: 最少时间——单源最短路满足最少时间的总的方案数——动态规划(通过单源最短路算法可知,路口 n-1 的最短时间,就是..原创 2021-08-23 22:53:17 · 207 阅读 · 0 评论 -
LeetCode789 逃脱阻碍者(贪心 | Manhattan距离)
题目:https://leetcode-cn.com/problems/escape-the-ghosts/一个玩家从 (0,0) 起步,另外若干个 ghosts 从 ghosts[] 起步每个回合都可向上下左右任意方向走1步输出:玩家能否躲避 ghost 到达 target题解:玩家能否躲避 ghost 到达 target——等价于玩家到 target 步数比任意 ghost 到 target 步数要少步数——上下左右任意方向走1步,总步数就是Manhattan距离代码原创 2021-08-23 22:00:54 · 105 阅读 · 0 评论 -
LeetCode5852.最小化目标值与所选元素的差(动态规划)
题目:5852.最小化目标值与所选元素的差https://leetcode-cn.com/contest/weekly-contest-255/problems/minimize-the-difference-between-target-and-chosen-elements/给定 m × n 的矩阵,以及整数 target从矩阵每行任选一个数,这 m 个数的总和,与 target 的差值绝对值最小题解:如果采用深度优先搜索,时间复杂度为,会超时考虑到数据范围:1 &l..原创 2021-08-22 13:38:59 · 157 阅读 · 0 评论 -
经典算法:最长递增子序列
配合题目:5841. 找出到每个位置为止最长的有效障碍赛跑路线题目要求:对于输入数组的每个元素,输出包含该元素、并以该元素为结尾的最长递增子序列的长度,即每个。(本题中的递增:n[i-1] ≤ n[i])方法一:动态规划定义ans数组,ans[i]为以num[i]为结尾的“最长递增子序列”的长度,则有:class Solution: def longestObstacleCourseAtEachPosition(self, obstacles: list[int])..原创 2021-08-08 19:53:33 · 347 阅读 · 0 评论 -
贪心算法常见与不常见应用
贪心算法的使用条件:1- 问题可以分解成子问题2- 子问题的局部最优解就是最终问题全局的最优解贪心算法与动态规划不同点:贪心算法的每个局部解只求一次,局部就有最优解,没有其它可能性,求下一个局部解不再回退。动态规划的某个状态不能确定最优解,保留了所有可能性,通过转移相当于由状态A的m个解求出状态B的n个解。常见贪心算法的应用:哈夫曼编码、图的最小生成树问题:背包问题使用贪心01背包问题:A 求最多件数(LeetCode 1833)B 求最满C 每件物品还有分数,..原创 2021-08-01 15:06:25 · 412 阅读 · 0 评论 -
Trie树(前缀树/字典树)定义、衍生及变种
trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。——引用自https://zh.wikipedia.org/wiki/Trie基本Trie树——初始化、插入、查找208. 实现 Trie (前缀树)clas...原创 2021-08-01 00:12:45 · 442 阅读 · 0 评论 -
LeetCode34 二分查找 & bisect
34. 在排序数组中查找元素的第一个和最后一个位置在有序数组中,查找某个元素的开始位置和结束位置方法1:采用 Python 自带二分查找库 bisectimport bisectclass Solution: def searchRange(self, nums: list[int], target: int) -> list[int]: left = bisect.bisect_left(nums, target) right = bisec原创 2021-07-17 16:53:41 · 184 阅读 · 0 评论 -
LeetCode 274/275 H指数(堆 heapq ,二分)
题目:H 指数:一名科研人员的 N 篇论文中,总共有 h 篇论文分别被引用了至少 h 次。且其余的N - h篇论文每篇被引用次数不超过 h 次。H指数1:给定无序数列,求H指数。H指数2:给定有序数列,在O(nlogn)求H指数。题解:H指数1:类似于堆排序,先建小顶堆 O(n),每次取堆顶值O(nlogn),判断是否满足h指数H指数2:二分法,判断分到的值是否满足h指数O(nlogn)源码:H指数1:import heapqclass Solution...原创 2021-07-12 22:44:02 · 148 阅读 · 1 评论 -
Leetcode 1008 前序遍历构造二叉搜索树(栈)
题目:给定二叉搜索树的前序遍历求出二叉搜索树题解:前序遍历是:根 - 左子树 - 右子树——所以很容易得出根节点右因为二叉搜索树的性质,左子树 < 根节点——所以,如果前序遍历的根节点后面跟随一个更小的值,那直接挂在左边。问题出现了,如果跟随了一个更大的值,应该挂在哪个级别的右子树?——使用栈存储右子树为空的节点,依次向栈的深处进行比较,直到栈取空或遇到栈内元素更大代码:# Definition for a binary tree node.# cl原创 2021-07-12 20:52:34 · 148 阅读 · 0 评论 -
动态规划在图应用 (Leetcode 743/1928)
朴素Dijkstra:743. 网络延迟时间以最佳节点为状态import collectionsimport heapqclass Solution: def networkDelayTime(self, times: list[list[int]], n: int, k: int) -> int: relation = collections.defaultdict(list) for [u, v, w] in times:原创 2021-07-12 18:56:57 · 212 阅读 · 0 评论 -
Leetcode 1411/5811 三种颜色涂色的方案数
5811. 用三种不同颜色为网格涂色数据规模:1 <= m <= 5, 1 <= n <= 10001411. 给 N x 3 网格图涂色的方案数数据规模:1 <= n <= 5000,就相当于 5811 题中固定 m = 3看数据规模,应该可以想到是递推关键是递推的阶段不是一块(m,n),而是一行 (n)每行有 type 种填写方法,使用 f[i][type] 记录第 i 行 第 type 种排列方案数量则有递推公式:原创 2021-07-12 14:07:16 · 404 阅读 · 0 评论 -
Leetcode 726 原子的数量 【栈+散列表】
题目:如果以化学专业名字解释,一句话概括:输入结构简式,输出分子式(元素顺序按字母顺序)例子:输入 输出 H2O H2O Mg(OH)2 H2MgO2 K4(ON(SO3)2)2 K4N2O14S4 Be32 Be32 题解:统计各元素总数。遇到括号,要把括号内的数量乘以括号右边的系数,括号可以嵌套。用到两种数据结构:散列表:用于存放元素名及其数量栈:遇到左括号时,当前散列表入栈,用一个新的空表处理当前括号内的内容(可以用原创 2021-07-05 23:48:27 · 155 阅读 · 1 评论 -
Leetcode 1 两数之和 - 用与不用哈希表的差异
题目:给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target 的那两个整数,并返回它们的数组下标。解答:方法一:用两个下标遍历数组,尝试所有两数组合,时间复杂度是 O(n²)方法二:对数组进行一层遍历,构建哈希表,存储已经遍历过的数字,时间复杂度是O(n)方法一:class Solution(object): def twoSum(self, nums, target): for m in rang...原创 2021-07-04 23:46:17 · 151 阅读 · 2 评论 -
LeetCode - 417 太平洋大西洋水流问题 Python BFS
题目:给定一个 m*n 矩阵,矩阵的每个点表示海拔“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。题解:对于太平洋和大西洋,各运行一次广度优先搜索,得到“流域”两洋“流域”交集的点,就是结果import collectionsclass Solution: def pacificA原创 2021-06-30 00:33:59 · 242 阅读 · 0 评论 -
LeetCode - 815 公交路线 BFS 广度优先搜索
500个线路,10**6个车站,求s站到t站最少坐几条线这道题分类很明显 BFS:无向无权图,最短路径# 难点在于,数据规模较大,怎么处理临接表,怎么优化两个思路:1 传统的,把车站作为图的节点;2 因为线路的数量少,可以把线路作为图的节点。优化方面:访问过的车站,访问过的线路,都及时跳过,防止重复遍历以车站为节点:import queueimport collectionsclass StationInfo(object): def __init__(sel原创 2021-06-28 23:55:35 · 262 阅读 · 2 评论 -
LeetCode - 909 蛇梯棋 BFS 广度优先搜索
BFS=广度优先搜索(借助队列)DFS=深度优先搜索(借助栈)树的前序遍历等价于树的广度优先搜索LeetCode - 909 蛇梯棋https://leetcode-cn.com/problems/snakes-and-ladders/题目类似于飞行棋,如果当前位于 x,下一步 y 可以在 [x+1, x+6] 位置任选,但是如果下一步坐标内有传送捷径,则必须使用且使用一次捷径。——单向图,求最短路径有一点简单的数学推导,就是“传送捷径”本来是一个一维数组,题目给定时,是把一原创 2021-06-27 23:32:10 · 161 阅读 · 0 评论