困难算法题
文章平均质量分 95
以力扣周赛第四题主。
闻缺陷则喜何志丹
本人拙作《闻缺陷则喜算法册》欢迎指教,可在CSDN下载https://download.csdn.net/download/he_zhidan/88368465
展开
-
【并集查找 最大公约数 调和数】952. 按公因数计算最大组件大小
给定一个由不同正整数的组成的非空数组 nums ,考虑下面的图:有 nums.length 个节点,按从 nums[0] 到 nums[nums.length - 1] 标记;只有当 nums[i] 和 nums[j] 共用一个大于 1 的公因数时,nums[i] 和 nums[j]之间才有一条边。返回 图中最大连通组件的大小 。原创 2024-04-27 17:00:00 · 556 阅读 · 3 评论 -
【组合数学 容斥原理 逆向思考】2930. 重新排列后包含指定子字符串的字符串数目
给你一个整数 n 。如果一个字符串 s 只包含小写英文字母,且 将 s 的字符重新排列后,新字符串包含 子字符串 "leet" ,那么我们称字符串 s 是一个 好 字符串。比方说:字符串 "lteer" 是好字符串,因为重新排列后可以得到 "leetr" 。"letl" 不是好字符串,因为无法重新排列并得到子字符串 "leet" 。请你返回长度为 n 的好字符串 总 数目。由于答案可能很大,将答案对 109 + 7 取余 后返回。子字符串 是一个字符串中一段连续的字符序列。原创 2024-04-27 07:00:00 · 1405 阅读 · 1 评论 -
【单源最短路 图论】3112. 访问消失节点的最少时间
给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] = [ui, vi, lengthi] 表示节点 ui 和节点 vi 之间有一条需要 lengthi 单位时间通过的无向边。同时给你一个数组 disappear ,其中 disappear[i] 表示节点 i 从图中消失的时间点,在那一刻及以后,你无法再访问这个节点。注意,图有可能一开始是不连通的,两个节点之间也可能有多条边。请你返回数组 answer ,answer[i] 表示从节点 0 到节点 i 需要的 最少 单位原创 2024-04-26 15:30:00 · 333 阅读 · 2 评论 -
【线段树 区间位运算模板】3117划分数组得到最小的值之和
给你两个数组 nums 和 andValues,长度分别为 n 和 m。数组的 值 等于该数组的 最后一个 元素。你需要将 nums 划分为 m 个 不相交的连续 子数组,对于第 ith 个子数组 [li, ri],子数组元素的按位AND运算结果等于 andValues[i],换句话说,对所有的 1原创 2024-04-26 07:00:00 · 627 阅读 · 5 评论 -
【回溯 深度优先搜索】980. 不同路径 III
在二维网格 grid 上,有 4 种类型的方格:1 表示起始方格。且只有一个起始方格。2 表示结束方格,且只有一个结束方格。0 表示我们可以走过的空方格。-1 表示我们无法跨越的障碍。返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目。每一个无障碍方格都要通过一次,但是一条路径中不能重复通过同一个方格。原创 2024-04-25 17:00:00 · 910 阅读 · 3 评论 -
【位运算 状态压缩 枚举子集】1178. 猜字谜
外国友人仿照中国字谜设计了一个英文版猜字谜小游戏,请你来猜猜看吧。字谜的迷面 puzzle 按字符串形式给出,如果一个单词 word 符合下面两个条件,那么它就可以算作谜底:单词 word 中包含谜面 puzzle 的第一个字母。单词 word 中的每一个字母都可以在谜面 puzzle 中找到。例如,如果字谜的谜面是 "abcdefg",那么可以作为谜底的单词有 "faced", "cabbage", 和 "baggage";而 "beefed"(不含字母 "a")以及 "based"(其中的 "s原创 2024-04-24 17:00:00 · 684 阅读 · 2 评论 -
【折半处理 二分查找】1755. 最接近目标值的子序列和
给你一个整数数组 nums 和一个目标值 goal 。你需要从 nums 中选出一个子序列,使子序列元素总和最接近 goal 。也就是说,如果子序列元素和为 sum ,你需要 最小化绝对差 abs(sum - goal) 。返回 abs(sum - goal) 可能的 最小值 。注意,数组的子序列是通过移除原始数组中的某些元素(可能全部或无)而形成的数组。原创 2024-04-24 07:00:00 · 572 阅读 · 4 评论 -
【动态规划 状态机dp 性能优化】3098. 求出所有子序列的能量和
给你一个长度为 n 的整数数组 nums 和一个 正 整数 k 。一个子序列的 能量 定义为子序列中 任意 两个元素的差值绝对值的 最小值 。请你返回 nums 中长度 等于 k 的 所有 子序列的 能量和 。原创 2024-04-22 07:00:00 · 1833 阅读 · 44 评论 -
【状态机dp 动态规划】100290. 使矩阵满足条件的最少操作次数
给你一个大小为 m x n 的二维矩形 grid 。每次 操作 中,你可以将 任一 格子的值修改为 任意 非负整数。完成所有操作后,你需要确保每个格子 grid[i][j] 的值满足:如果下面相邻格子存在的话,它们的值相等,也就是 grid[i][j] == grid[i + 1][j](如果存在)。如果右边相邻格子存在的话,它们的值不相等,也就是 grid[i][j] != grid[i][j + 1](如果存在)。请你返回需要的 最少 操作数目。原创 2024-04-22 17:00:00 · 1649 阅读 · 13 评论 -
【图论 单源最短路】100276. 最短路径中的边
给你一个 n 个节点的无向带权图,节点编号为 0 到 n - 1 。图中总共有 m 条边,用二维数组 edges 表示,其中 edges[i] = [ai, bi, wi] 表示节点 ai 和 bi 之间有一条边权为 wi 的边。对于节点 0 为出发点,节点 n - 1 为结束点的所有最短路,你需要返回一个长度为 m 的 boolean 数组 answer ,如果 edges[i] 至少 在其中一条最短路上,那么 answer[i] 为 true ,否则 answer[i] 为 false 。请你返回原创 2024-04-21 14:35:24 · 1640 阅读 · 13 评论 -
【位运算 拆位法】1835. 所有数对按位与结果的异或和
列表的 异或和(XOR sum)指对所有元素进行按位 XOR 运算的结果。如果列表中仅有一个元素,那么其 异或和 就等于该元素。例如,[1,2,3,4] 的 异或和 等于 1 XOR 2 XOR 3 XOR 4 = 4 ,而 [3] 的 异或和 等于 3 。给你两个下标 从 0 开始 计数的数组 arr1 和 arr2 ,两数组均由非负整数组成。根据每个 (i, j) 数对,构造一个由 arr1[i] AND arr2[j](按位 AND 运算)结果组成的列表。其中 0原创 2024-04-20 17:00:00 · 1350 阅读 · 12 评论 -
【状态压缩 并集查找 图论】2157. 字符串分组
给你一个下标从 0 开始的字符串数组 words 。每个字符串都只包含 小写英文字母 。words 中任意一个子串中,每个字母都至多只出现一次。如果通过以下操作之一,我们可以从 s1 的字母集合得到 s2 的字母集合,那么我们称这两个字符串为 关联的 :往 s1 的字母集合中添加一个字母。从 s1 的字母集合中删去一个字母。将 s1 中的一个字母替换成另外任意一个字母(也可以替换为这个字母本身)。数组 words 可以分为一个或者多个无交集的 组 。如果一个字符串与另一个字符串关联,那么它们应当属原创 2024-04-21 07:00:00 · 740 阅读 · 2 评论 -
【位运算 反证法 试填法】2897.对数组执行操作使平方和最大
给你一个下标从 0 开始的整数数组 nums 和一个 正 整数 k 。你可以对数组执行以下操作 任意次 :选择两个互不相同的下标 i 和 j ,同时 将 nums[i] 更新为 (nums[i] AND nums[j]) 且将 nums[j] 更新为 (nums[i] OR nums[j]) ,OR 表示按位 或 运算,AND 表示按位 与 运算。你需要从最终的数组里选择 k 个元素,并计算它们的 平方 之和。请你返回你可以得到的 最大 平方和。原创 2024-04-20 07:00:00 · 964 阅读 · 6 评论 -
【数学归纳法】【位运算】【异或】3068最大节点价值之和
给你一棵 n 个节点的 无向 树,节点从 0 到 n - 1 编号。树以长度为 n - 1 下标从 0 开始的二维整数数组 edges 的形式给你,其中 edges[i] = [ui, vi] 表示树中节点 ui 和 vi 之间有一条边。同时给你一个 正 整数 k 和一个长度为 n 下标从 0 开始的 非负 整数数组 nums ,其中 nums[i] 表示节点 i 的 价值 。Alice 想 最大化 树中所有节点价值之和。为了实现这一目标,Alice 可以执行以下操作 任意 次(包括 0 次):选择连接原创 2024-04-19 15:30:00 · 863 阅读 · 7 评论 -
【位运算 拆位法 二分】3007. 价值和小于等于 K 的最大数字
给你一个整数 k 和一个整数 x 。整数 num 的价值是由它的二进制表示中,从最低有效位开始,x,2x,3x,以此类推,这些位置上 设置位 的数目来计算。下面的表格包含了如何计算价值的例子。x num Binary Representation Price1 13 000001101 32 13 000001101 12 233 011101001 33 13 000001101 13 362 101101010 2num 的 累加价值 是从 1 到 num 的数字的 总 价值。如果 n原创 2024-04-19 07:00:00 · 1226 阅读 · 10 评论 -
【动态规划 状态机dp】3082. 求出所有子序列的能量和
给你一个长度为 n 的整数数组 nums 和一个 正 整数 k 。一个整数数组的 能量 定义为和 等于 k 的子序列的数目。请你返回 nums 中所有子序列的 能量和 。原创 2024-04-18 17:00:00 · 767 阅读 · 1 评论 -
线段树汇总
线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。区间更新(查询)的时间复杂度是O(logn),使用懒惰法只会影响以下四类节点,每类节点数量都不超过logn。一,左边界及其祖先。二,右边界及其祖先。三,第一类的兄弟节点。四,第二类的兄弟节点。原创 2024-04-18 08:24:29 · 1079 阅读 · 39 评论 -
【贪心 堆 】3081. 替换字符串中的问号使分数最小
给你一个字符串 s 。s[i] 要么是小写英文字母,要么是问号 '?' 。对于长度为 m 且 只 含有小写英文字母的字符串 t ,我们定义函数 cost(i) 为下标 i 之前(也就是范围 [0, i - 1] 中)出现过与 t[i] 相同 字符出现的次数。字符串 t 的 分数 为所有下标 i 的 cost(i) 之 和 。原创 2024-04-17 17:00:00 · 966 阅读 · 3 评论 -
【位运算 试填法】【推荐】3022. 给定操作次数内使剩余元素的或值最小
给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。一次操作中,你可以选择 nums 中满足 0原创 2024-04-16 17:00:00 · 1507 阅读 · 0 评论 -
【位运算 贪心】2835. 使子序列的和等于目标的最少操作次数
给你一个下标从 0 开始的数组 nums ,它包含 非负 整数,且全部为 2 的幂,同时给你一个整数 target 。一次操作中,你必须对数组做以下修改:选择数组中一个元素 nums[i] ,满足 nums[i] > 1 。将 nums[i] 从数组中删除。在 nums 的 末尾 添加 两个 数,值都为 nums[i] / 2 。你的目标是让 nums 的一个 子序列 的元素和等于 target ,请你返回达成这一目标的 最少操作次数 。如果无法得到这样的子序列,请你返回 -1 。数组中一个原创 2024-04-16 07:00:00 · 963 阅读 · 8 评论 -
【位运算】3097. 或值至少为 K 的最短子数组 II
给你一个 非负 整数数组 nums 和一个整数 k 。如果一个数组中所有元素的按位或运算 OR 的值 至少 为 k ,那么我们称这个数组是 特别的 。请你返回 nums 中 最短特别非空 子数组的长度,如果特别子数组不存在,那么返回 -1 。原创 2024-04-15 17:00:00 · 1627 阅读 · 15 评论 -
【状态压缩 容斥原理 组合数学】3116. 单面值组合的第 K 小金额
给你一个整数数组 coins 表示不同面额的硬币,另给你一个整数 k 。你有无限量的每种面额的硬币。但是,你 不能 组合使用不同面额的硬币。返回使用这些硬币能制造的 第 kth 小 金额。原创 2024-04-15 07:00:00 · 2671 阅读 · 78 评论 -
【动态规划 区间dp 位运算】3117. 划分数组得到最小的值之和
给你两个数组 nums 和 andValues,长度分别为 n 和 m。数组的 值 等于该数组的 最后一个 元素。你需要将 nums 划分为 m 个 不相交的连续 子数组,对于第 ith 个子数组 [li, ri],子数组元素的按位AND运算结果等于 andValues[i],换句话说,对所有的 1原创 2024-04-14 13:56:55 · 1423 阅读 · 16 评论 -
【排序 贪心】3107. 使数组中位数等于 K 的最少操作数
给你一个整数数组 nums 和一个 非负 整数 k 。一次操作中,你可以选择任一元素 加 1 或者减 1 。请你返回将 nums 中位数 变为 k 所需要的 最少 操作次数。一个数组的中位数指的是数组按非递减顺序排序后最中间的元素。如果数组长度为偶数,我们选择中间两个数的较大值为中位数。原创 2024-04-14 07:00:00 · 927 阅读 · 6 评论 -
【并集查找 图论 位运算】3108. 带权图里旅途的最小代价
给你一个 n 个节点的带权无向图,节点编号为 0 到 n - 1 。给你一个整数 n 和一个数组 edges ,其中 edges[i] = [ui, vi, wi] 表示节点 ui 和 vi 之间有一条权值为 wi 的无向边。在图中,一趟旅途包含一系列节点和边。旅途开始和结束点都是图中的节点,且图中存在连接旅途中相邻节点的边。注意,一趟旅途可能访问同一条边或者同一个节点多次。如果旅途开始于节点 u ,结束于节点 v ,我们定义这一趟旅途的 代价 是经过的边权按位与 AND 的结果。换句话说,如果经过的原创 2024-04-13 17:00:00 · 1202 阅读 · 9 评论 -
【线段树】【区间更新】2916. 子数组不同元素数目的平方和 II
给你一个下标从 0 开始的整数数组 nums 。定义 nums 一个子数组的 不同计数 值如下:令 nums[i..j] 表示 nums 中所有下标在 i 到 j 范围内的元素构成的子数组(满足 0原创 2024-04-13 07:00:00 · 904 阅读 · 2 评论 -
【线段树 有序映射】715. Range 模块
Range模块是跟踪数字范围的模块。设计一个数据结构来跟踪表示为 半开区间 的范围并查询它们。半开区间 [left, right) 表示所有 left原创 2024-04-12 15:30:00 · 965 阅读 · 2 评论 -
【线段树】2276. 统计区间中的整数数目
给你区间的 空 集,请你设计并实现满足要求的数据结构:新增:添加一个区间到这个区间集合中。统计:计算出现在 至少一个 区间中的整数个数。实现 CountIntervals 类:CountIntervals() 使用区间的空集初始化对象void add(int left, int right) 添加区间 [left, right] 到区间集合之中。int count() 返回出现在 至少一个 区间中的整数个数。注意:区间 [left, right] 表示满足 left原创 2024-04-12 07:00:00 · 1031 阅读 · 5 评论 -
【线段树】2213. 由单个字符重复的最长子字符串
给你一个下标从 0 开始的字符串 s 。另给你一个下标从 0 开始、长度为 k 的字符串 queryCharacters ,一个下标从 0 开始、长度也是 k 的整数 下标 数组 queryIndices ,这两个都用来描述 k 个查询。第 i 个查询会将 s 中位于下标 queryIndices[i] 的字符更新为 queryCharacters[i] 。返回一个长度为 k 的数组 lengths ,其中 lengths[i] 是在执行第 i 个查询 之后 s 中仅由 单个字符重复 组成的 最长子原创 2024-04-11 17:00:00 · 664 阅读 · 1 评论 -
图论知识汇总
深度优先 广度优先原创 2024-04-11 07:00:00 · 1247 阅读 · 86 评论 -
【线段树】【众数】1157数组中占绝大多数的元素
设计一个数据结构,有效地找到给定子数组的 多数元素 。子数组的 多数元素 是在子数组中出现 threshold 次数或次数以上的元素。实现 MajorityChecker 类:MajorityChecker(int[] arr) 会用给定的数组 arr 对 MajorityChecker 初始化。int query(int left, int right, int threshold) 返回子数组中的元素 arr[left...right] 至少出现 threshold 次数,如果不存在这样的元素原创 2024-04-10 17:00:00 · 795 阅读 · 2 评论 -
【状态机dp】【 排序 】 2809使数组和小于等于 x 的最少时间
给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒,对于所有下标 0原创 2024-04-10 07:00:00 · 900 阅读 · 7 评论 -
【数组】【最长距离】使循环数组所有元素相等的最少秒数
给你一个下标从 0 开始长度为 n 的数组 nums 。每一秒,你可以对数组执行以下操作:对于范围在 [0, n - 1] 内的每一个下标 i ,将 nums[i] 替换成 nums[i] ,nums[(i - 1 + n) % n] 或者 nums[(i + 1) % n] 三者之一。注意,所有元素会被同时替换。请你返回将数组 nums 中所有元素变成相等元素所需要的 最少 秒数。原创 2024-04-09 17:00:00 · 630 阅读 · 0 评论 -
【图论 状态压缩 枚举】2959. 关闭分部的可行集合数目
一个公司在全国有 n 个分部,它们之间有的有道路连接。一开始,所有分部通过这些道路两两之间互相可以到达。公司意识到在分部之间旅行花费了太多时间,所以它们决定关闭一些分部(也可能不关闭任何分部),同时保证剩下的分部之间两两互相可以到达且最远距离不超过 maxDistance 。两个分部之间的 距离 是通过道路长度之和的 最小值 。给你整数 n ,maxDistance 和下标从 0 开始的二维整数数组 roads ,其中 roads[i] = [ui, vi, wi] 表示一条从 ui 到 vi原创 2024-04-09 07:00:00 · 1034 阅读 · 5 评论 -
【线段树】【前缀和】:1687从仓库到码头运输箱子
你有一辆货运卡车,你需要用这一辆车把一些箱子从仓库运送到码头。这辆卡车每次运输有 箱子数目的限制 和 总重量的限制 。给你一个箱子数组 boxes 和三个整数 portsCount, maxBoxes 和 maxWeight ,其中 boxes[i] = [portsi, weighti] 。portsi 表示第 i 个箱子需要送达的码头, weightsi 是第 i 个箱子的重量。portsCount 是码头的数目。maxBoxes 和 maxWeight 分别是卡车每趟运输箱子数目和重原创 2024-04-08 17:00:00 · 973 阅读 · 0 评论 -
【单源最短路 图论】882. 细分图中的可到达节点
给你一个无向图(原始图),图中有 n 个节点,编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链,每条边之间的新节点数各不相同。图用由边组成的二维数组 edges 表示,其中 edges[i] = [ui, vi, cnti] 表示原始图中节点 ui 和 vi 之间存在一条边,cnti 是将边 细分 后的新节点总数。注意,cnti == 0 表示边不可细分。要 细分 边 [ui, vi] ,需要将其替换为 (cnti + 1) 条新边,和 cnti 个新节点。新节点为 x1, x2,原创 2024-04-08 07:00:00 · 2244 阅读 · 28 评论 -
【线段树】1622. 奇妙序列
请你实现三个 API append,addAll 和 multAll 来实现奇妙序列。请实现 Fancy 类 :Fancy() 初始化一个空序列对象。void append(val) 将整数 val 添加在序列末尾。void addAll(inc) 将所有序列中的现有数值都增加 inc 。void multAll(m) 将序列中的所有现有数值都乘以整数 m 。int getIndex(idx) 得到下标为 idx 处的数值(下标从 0 开始),并将结果对 109 + 7 取余。如果下标大于等于序原创 2024-04-07 17:00:00 · 632 阅读 · 2 评论 -
【最大值线段树】【二分查找】2286. 以组为单位订音乐会的门票
一个音乐会总共有 n 排座位,编号从 0 到 n - 1 ,每一排有 m 个座椅,编号为 0 到 m - 1 。你需要设计一个买票系统,针对以下情况进行座位安排:同一组的 k 位观众坐在 同一排座位,且座位连续 。k 位观众中 每一位 都有座位坐,但他们 不一定 坐在一起。由于观众非常挑剔,所以:只有当一个组里所有成员座位的排数都 小于等于 maxRow ,这个组才能订座位。每一组的 maxRow 可能 不同 。如果有多排座位可以选择,优先选择 最小 的排数。如果同一排中有多个座位可以坐,优先选择原创 2024-04-07 07:00:00 · 750 阅读 · 8 评论 -
【图论】【分类讨论】LeetCode3017按距离统计房屋对数目
给你三个 正整数 n 、x 和 y 。在城市中,存在编号从 1 到 n 的房屋,由 n 条街道相连。对所有 1原创 2024-04-06 17:00:00 · 1633 阅读 · 6 评论 -
【图论】【广度优先】【 并集查找】2092 找出知晓秘密的所有专家
给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号。另外给你一个下标从 0 开始的二维整数数组 meetings ,其中 meetings[i] = [xi, yi, timei] 表示专家 xi 和专家 yi 在时间 timei 要开一场会。一个专家可以同时参加 多场会议 。最后,给你一个整数 firstPerson 。专家 0 有一个 秘密 ,最初,他在时间 0 将这个秘密分享给了专家 firstPerson 。接着,这个秘密会在每次有知晓这个秘密的专家参加会议时进行传播。更正式的表达原创 2024-04-06 07:00:00 · 917 阅读 · 3 评论