秒杀系统设计(一):需求拆解与流量治理
秒杀的本质是漏斗,不是堆机器。作为系列第一篇,本文先拆解秒杀的功能与非功能需求(一人一单、防超卖、支持海量用户抢购),再用一段朴素代码暴露三类高并发问题,然后按"由外到内"的顺序逐层削流量:接入层的架构层次设计(单机 Nginx → 集群 → LVS/F5 → DNS 轮询)、Nginx 限流与 OpenResty、应用层令牌桶、Redis 挡量与 MQ 削峰,并给出 MQ 选型建议与每一层的坑点。
Hot 100 --- 寻找重复数
本文讲解寻找重复数:数组长度为 n+1、值都在 1~n 之间,所以每个值都是一个合法下标,可以把数组读成一张"每个位置指向 nums[位置]"的链表;重复值意味着两个下标指向同一节点,于是形成环,问题就变成找环入口。完整推导快慢指针为什么一定相遇、以及为什么相遇后同速走能停在环入口
Hot 100 --- 下一个排列
本文讲解下一个排列:要让排列"只变大一点点",就得找从右往左第一个升序相邻对(它右边的降序段已经顶到头了),用降序段里比它大的最小数替换,再把右边那段反转成升序,让它变成新前缀下的最小排列
Hot 100 --- 颜色分类
本文讲解颜色分类(荷兰国旗问题):只有 0、1、2 三个值,0 要排到最前面、2 要排到最后面,中间剩下的自然是 1;方法一是统计个数后重写,方法二用左右两个指针各守一端,一边遍历一边把 0 往左扔、2 往右扔,只需一遍扫描
Hot 100 --- 只出现一次的数字
本文讲解只出现一次的数字:其余数字都出现两次,异或运算满足 a^a=0、a^0=a 且可交换可结合,把所有数字全异或一遍,成对的互相抵消成 0,剩下的就是答案。用二进制逐位演示抵消过程,O(n) 时间、O(1) 空间
Hot 100 --- 编辑距离
本文讲解编辑距离的核心思路:dp[i][j] 表示 word1 前 i 个字符转成 word2 前 j 个字符的最少操作数;两个字符相等就跳过(不花操作),不相等就在删除、插入、替换三种手段里选最省的;方法一是二维 DP,方法二只保留上一行把空间降到 O(m)
Hot 100 --- 多数元素
本文讲解多数元素:多数元素出现次数超过 n/2,所以排序后下标 n/2 的位置一定是它;更优的摩尔投票法把问题看成"两两抵消",因为多数元素的总数超过其余元素之和,抵消到最后剩下的就是它,O(n) 时间、O(1) 空间
Hot 100 --- 最长公共子序列
本文讲解最长公共子序列的核心思路:盯着两个字符串各自的最后一个字符,相等就接在前缀最优解后面加 1,不等就看丢掉任意一边哪种更长取较大者;方法一是二维 DP 表,方法二只保留上一行用一维数组把空间降到 O(n)
Hot 100 --- 最长回文子串
本文讲解最长回文子串的两种经典思路:方法一是中心拓展,遍历每个字符,以它为中心向两边扩展判断回文,注意中心有两种(奇数长度和偶数长度);方法二是动态规划,判断一段字符串是不是回文只需看首尾字符相等且内部子串是回文,但必须先按长度从小到大递推
Hot 100 --- 最小路径和
本文讲解最小路径和的核心思路:只能向下或向右移动时,到达每个格子的最小路径和有且仅有上方和左方两个来源取较小值,用动态规划递推;与不同路径同结构,差别只在状态含义与初始化,方法二用一维数组滚动到 O(n) 空间





