摘要: 很多程序员第一次接触“搜索”,是在 LeetCode 上的全排列、组合、子集、N 皇后、数独、单词搜索这些题里。这些题做多了以后,我们很容易形成一套肌肉记忆:递归、选择、撤销选择、剪枝。 但搜索算法真正重要的地方,并不在递归本身。 递归只是遍历方式。搜索真正关心的是:如何把一个巨大的候选空间组织成一 阅读全文
posted @ 2026-05-10 23:07 Ofnoname 阅读(113) 评论(0) 推荐(0)
摘要: 编程时写整数乘法,通常我们不会太关心底层细节。a * b 写起来非常自然,好像一条语句就能瞬间完成。 对固定宽度整数来说,比如 32 位或 64 位整数,乘法通常确实可以由少量机器指令完成,成本可以近似看成常数。但如果是两个几千位、几万位甚至更大的整数相乘,情况就不一样了。此时 * 背后不再是一条简 阅读全文
posted @ 2026-05-09 18:28 Ofnoname 阅读(133) 评论(0) 推荐(0)
摘要: 在学习算法时,我们肯定会关注效率。于是我们会分析时间复杂度,比如 \(O(n)\)、\(O(n\log n)\)、\(O(n^2)\)。 但这只是算法分析的一半。另一半问题是:这个问题本身最快能做到多快?也就是说,在某个给定的计算模型下,不管你设计什么算法,它都不可能突破某个理论下界。 如果一个算法 阅读全文
posted @ 2026-05-02 18:19 Ofnoname 阅读(159) 评论(0) 推荐(0)
摘要: 上一篇文章里,我们已经讲过 P、NP 和 NP-Complete:P 是可以高效求解的问题,NP 是可以高效验证答案的问题,而 NP-Complete 是 NP 里最“硬核”的一批问题。 但如果继续追问下去,会出现一些更底层的问题:什么叫算法?怎样算高效?怎么精确定义时间和空间? 作为程序员,我们很 阅读全文
posted @ 2026-04-30 15:16 Ofnoname 阅读(180) 评论(0) 推荐(0)
摘要: 学习算法课学习到后期,都会进入一个看起来很理论话题:P、NP、NP-hard、NP-complete。这些概念想回答的核心问题是给各种问题和算法分类: 某个问题到底是“可以高效解决”,还是“很可能没有高效精确算法”? 这个判断非常重要。因为如果一个问题本质上是 NP-complete,那么你继续死磕 阅读全文
posted @ 2026-04-27 18:27 Ofnoname 阅读(210) 评论(2) 推荐(2)
摘要: 矩阵链乘法是动态规划中的经典区间 DP 问题。它的重点并不是如何计算两个矩阵相乘,而是:给定一串矩阵相乘,如何加括号,才能让总计算代价最小? 如果矩阵 \(A\) 的大小是 \(a \times b\),矩阵 \(B\) 的大小是 \(b \times c\),那么 \(AB\) 的大小是 \(a 阅读全文
posted @ 2026-04-26 17:16 Ofnoname 阅读(29) 评论(0) 推荐(0)
摘要: 动态数组扩容问题是均摊复杂度分析最经典的应用: 动态数组的尾插 push_back,有时会触发扩容; 一旦扩容,就要申请更大的内存、搬运旧元素、再插入新元素。某一次操作的代价完全可能是 \(O(n)\) 但是,动态数组尾插的复杂度是均摊 \(O(1)\) 类似的现象其实非常多:单看某一次操作,它们都 阅读全文
posted @ 2026-04-25 14:55 Ofnoname 阅读(84) 评论(0) 推荐(0)
摘要: 之前我们讲了主定理,用来解决: \( T(n)=aT(n/b)+f(n) \) 的复杂度 但现实里的递归,往往没有这么整齐。比如每个子问题的规模不同: \[T(n)=T(n/2)+T(n/3)+n \]这时候,主定理就不能直接用了。这篇我们讲一个更强的工具:Akra–Bazzi 定理。 主定理的扩展 阅读全文
posted @ 2026-04-24 17:04 Ofnoname 阅读(86) 评论(0) 推荐(0)
摘要: “求数组中第 k 大的元素”是一个非常经典的问题。 最直接的做法是先排序,再取排序后的第 k 个元素。但排序的时间复杂度是 O(n log n)。能不能做到 O(n)? 问题定义 给定一个长度为 n 的数组 nums,求其中第 k 大的元素。 例如: nums = [3, 2, 1, 5, 6, 4 阅读全文
posted @ 2026-04-11 22:46 Ofnoname 阅读(37) 评论(0) 推荐(0)
摘要: 很多人第一次接触动态规划,都是从“走格子”开始的:在一个二维网格上,从起点走到终点,每次只能做有限几种移动,问方案数、最小代价,或者最大收益。 第一题:最小路径和 给定一个 \(n \times m\) 的非负整数网格 \(a\),从左上角出发走到右下角,每次只能向右或向下走一步,路径上的数字都要累 阅读全文
posted @ 2026-04-10 18:40 Ofnoname 阅读(190) 评论(0) 推荐(1)