差分数组为何能用两次操作完成区间修改从前缀和逆运算到LeetCode完整通关指南
假设有一个长度为10000的数组,需要对区间[100, 5000]内的每个元素都加3,然后再对区间[200, 8000]内的每个元素减5,最后还要对区间[1000, 9000]内的每个元素加10。这样的操作要重复进行1000次,最后输出最终结果。 ...
假设有一个长度为10000的数组,需要对区间[100, 5000]内的每个元素都加3,然后再对区间[200, 8000]内的每个元素减5,最后还要对区间[1000, 9000]内的每个元素加10。这样的操作要重复进行1000次,最后输出最终结果。 ...
扫描线算法是计算几何中最优雅的算法范式之一。它的核心思想简单得令人惊讶:用一条假想的线扫过整个平面,只在关键点停下来处理。这个朴素的想法却催生了计算复杂度理论的重大突破。1976年,Michael Shamos 和 Dan Hoey 发表了标志性的线段相交检测算法,证明了扫描线结合平衡二叉树可以在 $O(N \log N)$ 时间内判断 $N$ 条线段是否存在交点——这在当时是革命性的结果。随后,Bentley 和 Ottmann 将其扩展为报告所有交点的算法,Fortune 在 1986 年用扫描线构造 Voronoi 图,这些工作奠定了计算几何作为独立学科的基础。 ...
每次你在终端输入 git diff,后台都在运行一个你可能刷过无数次的算法题——最长公共子序列。这不是巧合,而是计算机科学中最优雅的算法之一在实际工程中的自然落地。从版本控制到生物信息学,从拼写检查到数据压缩,LCS 找到了两个序列之间"最相似的部分",而这个看似简单的问题背后,隐藏着动态规划的精髓。 ...
1901年,哈佛大学教授Charles L. Bouton在《数学年鉴》上发表了一篇论文,题为"Nim, A Game with a Complete Mathematical Theory"。这篇论文揭示了一个令人震惊的事实:一种看似需要随机应变的策略游戏,竟然可以用一个简单的数学公式完全预测胜负。这个公式就是——异或和(XOR sum)。 ...
1962年,Michael Held和Richard Karp在《Journal of the Society for Industrial and Applied Mathematics》上发表了一篇论文,提出了用动态规划求解旅行商问题(TSP)的算法。这个算法的时间复杂度是 $O(n^2 \cdot 2^n)$——虽然仍然是指数级,但相比暴力枚举的 $O(n!)$,已经是一个巨大的飞跃。这个算法的核心思想,正是后来被称为"状态压缩动态规划"(Bitmask DP / State Compression DP)的开山之作。 ...
1955年,Allen Newell、Cliff Shaw和Herbert A. Simon在RAND Corporation和卡内基梅隆大学开发Information Processing Language(IPL)时,创造了链表这一数据结构。这个发明最初是为了支持早期人工智能程序——Logic Theory Machine和General Problem Solver。有趣的是,链表在诞生之初就是为解决复杂问题而生,而今天它却成了面试中最基础却又最容易出错的考题之一。 ...
有 $n$ 个气球排成一排,每个气球上标有一个数字。当你戳破第 $i$ 个气球时,你会获得 nums[i-1] * nums[i] * nums[i+1] 枚硬币。如果相邻位置超出边界,则视为数字为 1 的虚拟气球。问题是:如何安排戳气球的顺序,才能获得最多的硬币? ...