Archive: 2020/9

贪心-分拆问题

摘要: 一些用贪心解决的分拆类问题, 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 在文章 分拆类问题汇总 中我们总结了分拆类问题。这类问题没有固定的算法,要根据具体的问题看,本文我们看一下适用贪心

贪心-部分背包

摘要: 部分背包问题 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 01 背包和完全背包是动态规划中很基础并且很重要的一类问题。 在 01 背包的基础上,对于每个物品 i,如果可以拿走其一部分,而不

贪心-不限操作方式的重排问题

奇数位置元素排在偶数位置元素之前 相邻 k 个元素不同 767. 重构字符串 358. K 距离间隔重排字符串 621. 任务调度器 1054. 距离相等的条形码 田忌赛马 870. 优势洗牌 455. 分发饼干 1433. 检查一个字符串是否可以打破另一个字符串 情侣牵手 组合数学5-群论 765. 情侣牵手 权值最大 1589. 所有排列中的最大和 1402. 做菜顺序

子序列匹配

摘要: 子序列匹配问题 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 在文章 字符串精确匹配 中我们学习了字符串精确匹配的问题,本文我们看一下子序列匹配问题,涉及到贪心、动态规划、序列自动机等算法。

贪心-构造性问题

984. 不含 AAA 或 BBB 的字符串 1405. 最长快乐字符串 484. 寻找排列 651. 4键键盘 995. K 连续位的最小翻转次数 1046. 最后一块石头的重量 1253. 重构 2 行二进制矩阵 1605. 给定行和列的和求可行矩阵 1354. 多次求和构造目标数组 1144. 递减元素使数组呈锯齿状 1540. K 次操作转变字符串 1558. 得到目标数组的最少函数调用

贪心-删数,拼数,选数,改数

摘要: 贪心算法解决数字构造问题:删数、拼数、选数、改数 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 本文罗列一下力扣上的一大类问题,也就是贪心算法解决的数字构造问题,包括删数、拼数、选数、改数等

贪心

摘要: 本文系统梳理了贪心相关的算法。并汇总了 leetcode 上的相关的题目。 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 正确性证明(Ref: 《算法竞赛进阶指南》) 微扰法 范围缩放

贪心-加油站问题

$1 基础问题134. 加油站问题在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。 说明:123如果题目有解,该答案即为唯一答案。输入数组均为非空数组,

【DP难题】力扣903-DI序列的有效排列

dp[i][k] 型单串线性DP 区间DP 预处理组合数 C(i, j, p), 其中 1 <= i <= n, 0 <= j <= i $1 题目题目链接903. DI 序列的有效排列 题目描述我们给出 S,一个源于 {‘D’, ‘I’} 的长度为 n 的字符串 。(这些字母代表 “减少” 和 “增加”。)有效排列 是对整数 {0, 1, …, n} 的一个排列 P[

力扣23-合并K个升序链表

今天我们继续看一道经典题(陈题),leetcode第23题,合并 K 个升序链表。 本题有两个主流解法: 算法1:堆算法2:分治 这两个都是在 leetcode 上能整理出几十道题的常见算法,并且有一定难度,周赛的 B 和 C 题中经常会出现。 很多链表的操作会以本题为组件,例如链表的归并排序,例如 leetcode 第 355 题,设计推特,等等。 下面我们看一下这个题 链表K路归并 堆 分治

【二分难题】力扣4-寻找两个正序数组的中位数

二分答案 二分K 二分整个索引范围 topK问题汇总 $1 题目题目链接4. 寻找两个正序数组的中位数 题目描述给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。 请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 $O(\log (m + n))$。 你可以假设 nums1 和 nums2 不会同时为空。 样例 示例 1:nums1 = [1, 3]nu

python虚拟机相关资源

摘要: 本文介绍一些 Python 虚拟机相关的资料 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 《Python源码剖析》 2008 《Python3源码剖析》开源电子书项目 https://f

【STL】字典序比较 lexicographical_compare

摘要: 本文介绍在 C++ STL 中的字典序比较方法 lexicographical_compare 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 本文介绍在 C++ STL 中的字典序比较方法

奇数位置元素排在偶数位置元素之前

摘要: 线性结构上的一种常见操作 【对数据分析、人工智能、金融科技、风控服务感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:潮汐朝夕我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 本文我们来看一个在线性结构上非常常见的操作,就是将奇数位置的元素排在偶数位置的元素之前。 首先我们考

【分治难题】力扣932-漂亮数组

摘要: 【对数据分析、人工智能、金融科技、风控服务感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:潮汐朝夕我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 分治法: 分治 寻找数学性质保证子问题与原问题是同一个问题 仿射变换的性质 $O(N)$ 分解 $O(1)$ 合并 调

【C++17】string_view

摘要: 本文介绍 C++17 中的一个字符串相关的新特性 string_view,主要参考《C++17 STL Cookbook》$7-3 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 本文介绍 C

区间DP

区间 DP 分治型 减治型 减治型区间DP题目 5. 最长回文子串 647. 回文子串 486. 预测赢家 516. 最长回文子序列 1147. 段式回文 730. 统计不同回文子字符串 1312. 让字符串成为回文串的最少插入次数 1216. 验证回文字符串 III 1278. 分割回文串 III 分治型区间DP题目 312. 戳气球 471. 编码最短长度的

逆向思维

摘要: 本文梳理了 leetcode 上用逆向思维的思想解决的问题。 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 本文梳理力扣上 9 道用逆向思维的思想解决的问题,总览如下: 1558. 得到目

【设计难题】力扣895-最大频率栈

摘要: 基于链表+哈希表解决与频数相关的设计问题 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 各位好,本文我们来看一个设计问题。需求与频数相关,具体地就是在栈的基础上,push 的操作不变,pop

leetcode模拟问题汇总

摘要: 模拟类的题目总结 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 数组或字符串上的模拟(1) 转换 38. 外观数列 273. 整数转换英文表示 1089. 复写零 (2) 其它 75

递归

递归的三种情况 定义是递归的 数据结构是递归的 问题解法是递归的 $1 定义是递归的例如字典,字典中的词,是由其它词来定义的。而这些其它词的定义又会直接或间接地用到由它们定义的词。 使用递归有一个基本条件:有一些 base case 可以采用非递归的方式计算出来。 括号问题汇总语法分析问题分类汇总其它 87. 扰乱字符串 761. 特殊的二进制序列 776. 拆分二叉搜索树 1003. 检查替

分治

主定理 二分分治 932. 漂亮数组 169. 多数元素 23. 合并K个升序链表 53. 最大子序和 751. IP 到 CIDR 参考 线段树,树状数组 四分分治 1274. 矩形内船只的数目 参考 二维线段树,二维树状数组 CDQ分治 315. 计算右侧小于当前元素的个数 参考 离散化,权值线段树,权值树状数组 线段树和树状数组题目汇总 相似的场景概念 分治与

《概率与计算》

摘要: 《概率与计算》这本书 【对数据分析、人工智能、金融科技、风控服务感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:潮汐朝夕我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 这是一个挖坑贴,随机算法是大数据算法中的重要的算法,《概率与计算》是讲随机算法的书中风评比较好的,此外还

【贪心难题】力扣1585-检查字符串是否可以通过排序子字符串得到另一个字符串

第 206 场周赛 D 题 贪心算法 $1 题目题目链接1585. 检查字符串是否可以通过排序子字符串得到另一个字符串 题目描述给你两个字符串 s 和 t ,请你通过若干次以下操作将字符串 s 转化成字符串 t : 选择 s 中一个 非空 子字符串并将它包含的字符就地 升序 排序。比方说,对下划线所示的子字符串进行操作可以由 “14234” 得到 “12344” 。 如果可以将字符串 s 变成

k短路

K 短路 178. 第K短路 问题给定一张N个点(编号1,2…N),M条边的有向图,求从起点S到终点T的第K短路的长度,路径允许重复经过点或边。 注意: 每条最短路中至少要包含一条边。 数据格式 第一行包含两个整数N和M。接下来M行,每行包含三个整数A,B和L,表示点A与点B之间存在有向边,且边长为L。最后一行包含三个整数S,T和K,分别表示起点S,终点T和第K短路。 12341 <&

滑动谜题和八数码

数字华容道可行性: 108. 奇数码问题 数字华容道1: 773. 滑动谜题 数字华容道2: 179. 八数码 置换群理论判定数字华容道可行性 组合数学5-群论 DFS BFS Astar IDAstar 用康拓编码给排列的哈希做空间压缩 排列算法 $0 置换群理论判定可行性原理算法基于置换群的理论,Ref : 组合数学5-群论 涉及到奇置换,偶置换,循环,对换的概念 奇置换:一

基于 Floyd 搜索有向图的所有最小环

搜索有向图最小环长度并返回一个最小环 无向图的环 有向图的环 Floyd 搜索有向图所有的最小环 应用:854. 相似度为 K 的字符串 注: 最小环的问题也可以用 dijkstra 求解 $1 求有向图最小环长度并返回一个最小环有向图的环的基本概念参考:有向图的环 无向图 Floyd 求最小环的过程参考 无向图的环,有向图的情况类似。 考虑 Floyd 的过程: 在最外层 k 在迭代过

【搜索难题】力扣854-相似度为K的字符串

有向图的环 建图 Ref: 官解 一个有重边和自环的图,按照规则改变内部的边,使得所有的边都是自环 规则:当某个位置的字符不相等时,需要一步交换,这步交换涉及到图中两条边的改动 长为 l 的环可以用 l - 1 次按照规则对边的修改得到 l 个自环(Ref: 置换群中的一个 l 循环 $(1,2,…,l)$ 可以用 l - 1 次对换变为 $(1),(2),(3),…,(l)$) 将图分解为多个

双向搜索

双向搜索的思想 双向BFS 双向迭代加深 $1 双向搜索的思想在一些问题中,初态和终态都是确定的,并且从初态想终态搜索,并且两个方向的搜索是等效的,和从终态向初态搜索都可以覆盖整个搜索空间,相当于搜索路径可逆。此时可以采用双向搜索。 在搜索过程中对状态染色,一共有三种: 未访问过 属于初态搜索树 属于终态搜索树 当属于初态的搜索树和属于终态的搜索树在某个状态相遇了,则搜索到了答案,此时根

单词矩阵

【搜索难题】力扣425-单词方块 数据结构维护状态转移时所需的查询需求 剪枝手段: 剪枝 $1 题目题目链接面试题 17.25. 单词矩阵 题目描述给定一份单词的清单,设计一个算法,创建由字母组成的面积最大的矩形,其中每一行组成一个单词(自左向右),每一列也组成一个单词(自上而下)。不要求这些单词在清单里连续出现,但要求所有行等长,所有列等高。 如果有多个面积最大的矩形,输出任意一个均可。一

【搜索难题】力扣679-24点游戏

摘要: 最经典的 24 点判定问题。 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 各位好,1024 快到了,各公司的程序员的活动也都出来了,力扣也不例外,出了一个参与感还挺强的活动。不过活动说明可

Trie题目汇总

Trie 基本功能的思想和实现 : 力扣208-Trie 208. 实现 Trie (前缀树) Trie 的插入,查找单词和前缀是否存在 211. 添加与搜索单词 - 数据结构设计 Trie 中的搜索 基于字典树的串上搜索 212. 单词搜索 II Trie + DFS 720. 词典中最长的单词 Trie + DFS 425. 单词方块 Trie + DFS 745. 前缀和后缀搜索

01Trie

摘要: 01Trie 的实现,附代码模板和应用 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 在文章 Trie 中我们了解了 Trie 的原理与实现。如果 Trie 的节点只含有 0, 1 这两种值

【搜索难题】力扣425-单词方块

DFS 数据结构维护状态转移 $1 题目题目链接425. 单词方块 题目描述给定一个单词集合 (没有重复),找出其中所有的 单词方块 。 一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < max(行数, 列数)) 来看都是相同的字符串。 例如,单词序列 [“ball”,”area”,”lead”,”lady”] 形成了一个单词方块,因为每个单词从水

【搜索难题】力扣282-给表达式添加运算符

复杂的状态和转移 用类似单调栈的逻辑维护表达式符号和值 $1 题目题目链接282. 给表达式添加运算符 题目描述给定一个仅包含数字 0-9 的字符串和一个目标值,在数字之间添加二元运算符(不是一元)+、- 或 * ,返回所有能够得到目标值的表达式。 样例 示例 1:输入: num = “123”, target = 6输出: [“1+2+3”, “123”] 示例 2:输入: num = “

IDAstar

IDAstar 算法 迭代加深 Astar 估价函数 IDAstar算法 代码 题目 1091. 二进制矩阵中的最短路径 854. 相似度为 K 的字符串 773. 滑动谜题 / 179. 八数码 180. 排书 $1 IDAstar 算法Astar 回顾Ref: Astar Astar 是一个带有估价函数的优先级队列 BFS 算法。因此 Astar 有一个缺点就是要维护优先级队列

建图的CornerCase

摘要: 建图的各种 Corner Case 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 本文我们通过一个拓扑排序的应用问题,看一下在建图时可能遇到的各种 Corner Case。此外本题还有一个值

剪枝

影响搜索的时间效率的因素 搜索树的规模,影响时间复杂度 每个状态上记录,检索,更新的时间,影响常数 剪枝做的事情是减小搜索树的规模 常见手法: 优化搜索顺序 等效性剪枝 可行性剪枝 最优性剪枝 记忆化 $1 优化搜索顺序搜索树的各个层次,各个分支之间的顺序是不固定的,不同的搜索顺序会产生不同的搜索树形态。 搜索顺序$2 等效性剪枝如果能判定从搜索树的当前节点上沿着某几条不同分支到达的子树

迭代加深

迭代加深 DFS 回顾 迭代加深的思想 迭代加深的代码 迭代加深的适用性 题目 $1 迭代加深的思想和算法DFS 回顾DFS 的逻辑是每次选定一个分治,不断深入,直到达到递归边界才回溯。这种方法退域很多搜索问题非常有效,尤其是配合剪枝,记忆化等手段后很有威力。 但是 DFS 也有弱点:当每个节点的分支非常多,且问题的答案在比较浅的节点上的时候,DFS 一旦选错了分支,就可能在不包含答案的

力扣1091-Astar,IDAstar

本题我们看一个 常规BFS, 无权图最短路模型, Ref BFS Astar, Ref Astar IDAstar, Ref IDAstar c++ 二维动态数组的创建和初始化 $1 题目 1091. 二进制矩阵中的最短路径 给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1 。 二进制矩阵中的 畅通路径 是一条从 左上角 单

【搜索难题】力扣1263-推箱子

摘要: 搜索难题,推箱子问题 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 本文我们看一个很有挑战性的搜索问题,算法的框架是以 BFS 为核心的最短路径。但是有两个难点: 在推 BFS 的过程中,

双端队列BFS

摘要: 基于双端队列的 BFS 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 在文章 带权图最短路径 中我们全面学习了带权图最短路径的算法,其中 BFS 是一类非常重要的算法。但是常规的 BFS 只

Astar

dijkstra 回顾 Astar 思想 估价函数 例子 1091. 二进制矩阵中的最短路径 675. 为高尔夫比赛砍树 854. 相似度为 K 的字符串 773. 滑动谜题 / 179. 八数码 178. 第K短路 $1 Astar回顾优先级队列 BFS(dijkstra)维护一个优先级队列,不断从队列中去除当前代价最小的状态进行扩展,每个状态第一次从队列中取出的时候,就得到了从初始状态

【搜索难题】力扣675-BFS常数优化,Astar,Hadlock算法

BFS 中的常数优化办法 基本BFS12中文版 TLE英文版 1712ms 勉强过 优化1:将 forest[i][j] 值加进 Point 字段,而不在 cmp 中持有 forest 矩阵121944ms英文版 1628 ms 优化2:将 Point 的 x, y 变成 pos (x * m + y)121760ms英文版 1392ms 优化3:将 visited 的索引从 x, y 变成 p

minimax

极小化极大问题描述和定义 极小化极大问题分类 极小化极大解法 minimax算法 minimax 算法优化: $\alpha-\beta$ 剪枝 题目 minimax 843. 猜猜这个单词 minimax + 数学推导 292. Nim 游戏 博弈DP: minimax + DP/记忆化搜索 294. 翻转游戏 II minimax + 记忆化搜索 SG定理 464.

离散化

摘要: 离散化的原理和代码模板 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 离散化属于排序算法的应用,目的是把无穷大集合中的若干元素映射为有限集合,以便于统计。 很多时候,问题的范围是定义在整数集

【搜索难题】力扣913-猫和老鼠

摘要: 本文详细拆解 leetcode 913-猫和老鼠,主要涉及对抗搜索与minimax、记忆化搜索、染色 BFS 等算法。 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 今天分享一个对抗搜索的问

【搜索难题】力扣126-两次搜索,搜索路径

搜索过程记录路径的方法 两次搜索 双向 BFS 优化: 枚举点找边改成枚举边找点 $1 题目题目链接126.单词接龙 II 题目描述给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则: 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典中的单词。 说明: 1234

【搜索难题】力扣127-双向BFS

双向 BFS: 稠密图收益极大 BFS 的时间复杂度和优化 $1 题目题目链接127 单词接龙 题目描述给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则: 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典中的单词。 说明:12345如果不存在这样的转换序列,返回 0。所有单词

【搜索难题】力扣1036-逃离大迷宫

摘要: 本文详细拆解 leetcode 1036-逃离大迷宫,有带步数上限的 BFS 和二维离散化两种方法 【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】我的网站:潮汐朝夕的生活实验室我的公众号:算法题刷刷我的知乎:潮汐朝夕我的github:FennelDumplings我的leetcode:FennelDumplings 今天我们看一个迷宫上的问题,迷宫是非常大的一