题目重点:Senior Lead AI coding 题目只给 Sort Colors inplace 题名;按经典 0/1/2 训练版讲三指针算法,并标出需核接口。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版数组元素只取 0、1、2,要求修改原数组,允许交换,不要求保持同色元素原相对顺序。
- 若真实题有更多颜色或稳定排序要求,三指针方案不能直接宣称满足,需现场确认。
解题路线
- 维护区间 [0,low) 全为 0,[low,mid) 全为 1,[mid,high] 未检查,(high,n) 全为 2。初始 low=mid=0、high=n−1。
- 若 nums[mid]=0,交换 low/mid 后两指针都加一;若为 1,mid 加一;若为 2,交换 mid/high,high 减一但 mid 不变,因为换来的数尚未检查。
- 每步未检查区间长度缩一,且已确定区间不变量保持;循环到 mid>high 即全数组分区完毕。
手动走一遍
训练数组 [2,0,2,1,1,0]:先把首个 2 与末尾 0 换成 [0,0,2,1,1,2],mid 仍在 0;处理两个 0,再将中间 2 与右边 1 换,最后得到 [0,0,1,1,2,2]。
规模与取舍
单次扫描 O(n) 时间、O(1) 额外空间;交换次数 O(n)。算法通常不稳定,若题目要求稳定则要另做取舍。
易错点与追问
容易失分的边界
- 交换 2 后立即 mid++,漏检查换入元素。
- 没核原题是否真的只有三种取值。
- 声称三指针保证稳定。
- 空数组的 high=-1 要让循环自然退出。
继续深挖
- 如果有 k 种颜色怎么办?
- 稳定原地排序如何做、复杂度代价是什么?
- 数据在流中不能随机访问时如何处理?
