单调队列(Monotonic Queue) 是算法里一个非常高频、又极具“灵气”的工具。
你一旦掌握它,就能轻松解决一大类 滑动窗口最值 / 动态规划优化 的题目,比如:
- 🔹 LC239:滑动窗口最大值
- 🔹 LC1696:跳跃游戏 VI
- 🔹 LC1425:带约束的子序列和
- 🔹 LC862:和至少为 K 的最短子数组
- 🔹 各类“最大最小区间”、“DP 优化”等
下面我们分层讲,层层深入👇
单调队列(Monotonic Queue) 是算法里一个非常高频、又极具“灵气”的工具。
你一旦掌握它,就能轻松解决一大类 滑动窗口最值 / 动态规划优化 的题目,比如:
下面我们分层讲,层层深入👇
位运算(bitwise operations)是所有算法和底层逻辑的核心之一。
计算机底层存储的所有数据都是二进制的 0
和 1
。
位运算就是直接对这些二进制位(bit)进行操作的运算。
它的好处是:
前缀树,又叫 字典树(Trie),是一种树形数据结构,用于 高效存储和查找字符串集合,尤其擅长处理 前缀匹配问题。
特点:
每个节点表示一个字符串的 前缀,根节点表示空字符串。
从根节点到某个节点的路径,形成了该节点所代表的字符串前缀。
节点通常包含:
isEnd
)在 LeetCode 上,「区间集合」问题通常是指:
给定若干个区间(形如
[start, end]
),让你去合并、插入、统计重叠、计算空隙、或选择最大不重叠子集等操作。
例如:
输入:[[1,3], [2,6], [8,10], [15,18]]
输出:[[1,6], [8,10], [15,18]]
单调栈 是一种特殊的栈结构,它在“栈中元素单调递增或单调递减”这一规则下进行操作。
它不是一种新的数据结构,而是一种 使用栈解决某类问题的技巧。
简单来说:
动态规划就是把一个复杂问题拆成相互重叠的子问题,把子问题的答案记下来(记忆化或表格),避免重复计算,从而高效求解。
核心是 最优子结构 + 重叠子问题。
dp[...]
表示什么(必须能唯一表示子问题)。例如:dp[i]
表示前 i
项的最优值,或 dp[i][j]
表示前 i
个物品、容量为 j
时的最优值。dp[0]=...
,dp[i][0]=...
。dp
中读出最终答案(可能在 dp[n]
或 max(dp[i])
)。回溯是一种 系统地搜索所有可能解的算法思想,常用于解决 组合、排列、子集、路径等问题。
它可以看作是一种 “试错 + 撤销” 的过程:
合理运用心流通道,科学刷题,快乐刷题!
怎么刷算法题?按照什么顺序刷题?如何科学地提高算法能力?
如果你刚开始刷题,还不熟悉基本编程语法和常用库函数,推荐先刷力扣官方的入门题单:
分布式计算机系统的要求刺激了将相同信息的副本保存在计算机网络中的不同节点的兴趣。
数据复制允许信息位于其使用点附近,可以通过在高使用区域中静态定位副本,也可以根据需要动态创建临时副本。
通过允许许多节点并行处理对相同信息的请求,数据复制也增加了数据的可用性,并掩盖部分系统故障。
因此,在某些情况下,维护副本的成本会被复制数据所提供的性能,通信成本和可靠性优势所抵消。
我们提出了一种维护复制文件的新算法。
该算法可以通过以下描述简要表征:
为复制文件的每个副本分配一定数量的投票。
每个事务收集读取法定数量的r票数以读取文件,以及写入法定数量的w票数以写入文件,使得r + w大于分配给文件的总票数。
这可确保每个读取仲裁与每个写入仲裁之间存在非空交集。 总是有一个文件代表的子集,其总票数为w当前。
因此,所收集的任何读取法定数量都保证具有当前副本。
版本号可以确定哪些副本是最新的。