按 OD 真实题型分布编排,用 LeetCode 经典题打通字符串模拟→搜索→贪心→DP→图的完整能力链
华为 OD 机试真题多为自定义输入输出的模拟与字符串题,与通常的 LeetCode 刷题顺序差异较大。本路径诚实地以 OD 高频考察「能力项」为轴,用 LeetCode 经典题覆盖对应技能,按 OD 题型分布(字符串&模拟 > 数组&排序 > 贪心 > DFS/BFS > 动态规划 > 并查集/图 > 堆)从高频到低频编排。练完这条线,你在 OD 机试各题型遭遇陌生题面时都有套路可循,而不是凭感觉。
适合:备考华为 OD 机试、要对齐 OD 题型的求职者
OD 字符串题的核心套路:① 哈希计数做频次/去重;② 双指针/滑窗做子串定位;③ 栈做括号/嵌套结构解码。掌握这三板斧,覆盖 OD 最高频的字符串处理类题型。
用长度 26 的频次数组统计两个字符串字符差,OD 「字符同构/异位」模拟的基本工具。
上一题用 26 位频次数组判字符集相等;本题改为纵向逐列扫描找公共前缀,从「集合是否同构」切到「位置对齐截断」。
哈希记录字符上次出现位置,left 随重复字符右移;变长滑窗的原型,OD「无重复/不含某字符的最长段」直接套用。
定长滑窗 + 26 位频次数组比对,窗口整体滑动而非每次重建;OD「固定窗口找匹配子串」的标准实现。
定长滑窗匹配子串;本题从子串匹配切到格式解析,引入线性状态机处理前导空格/符号/溢出截断,OD 高频边界处理思维。
线性状态机处理平铺结构;嵌套结构需用栈把递归显式化:遇 [ 压当前层,遇 ] 弹出拼接,从线性解析升级到嵌套展开。
OD 数组题惯用四招:双指针消重/对撞、前缀和做区间查询、哈希表做计数去重、自定义排序做排列调度。中等难度打底,用一道螺旋矩阵收口模拟方向控制。
哈希表一次遍历存「目标 - 当前值」,OD「两数/多数组合」枚举从 O(n²) 降到 O(n) 的万能起点。
排序 + 对撞双指针,去重靠跳过相同元素而非集合;OD「多数之和/组合枚举」从两数之和扩展的标准路径。
前缀和 + 哈希表,将「子数组和 = k」转为「前缀差计数」;OD「连续段和满足条件」类题的通用公式。
四边界变量随遍历方向收缩,按层模拟螺旋;OD「矩阵遍历/路径填充」模拟的边界控制标准模板。
自定义比较器:把 a+b 与 b+a 作为字符串比大小决定 a/b 的排列顺序;OD「排列使结果最大/最优」的排序技巧。
OD 贪心题型:区间调度(按截止时间排序)、路径跳跃(维护最远可达)、字符/糖果分配(双向扫描满足双向约束)。贪心的关键是找到正确的「当前局部最优选择」并证明它不影响全局。
维护一个「当前最远可达下标」,遍历时不断更新最远覆盖;OD「路径可达性/覆盖范围」贪心的原型。
跳跃游戏 I 的最少步数版:按「当前层最远边界」分层推进,每层结束才 +1 步;贪心 BFS 等价的经典压缩。
按区间右端点排序,贪心保留右端最小的区间;OD「区间冲突/会议室/资源调度」题的核心思路。
先预处理每个字符最远出现位置,再一次遍历用「当前段最远右界」做分割;OD「字符分段/最少切割」的双阶段贪心。
若总油量 ≥ 总耗量则一定有解,从当前累计为负时重置起点;OD「环形路径/满足条件的起点」贪心。
按最高频任务决定冷却帧数,结果 = max(任务总数, (maxFreq-1)*n + maxCount);OD「任务/进程调度最短时间」的贪心公式。
OD 搜索题两大场景:网格连通(岛屿/区域 DFS/BFS)和图上最短路/状态扩散(多源 BFS)。搜索题通常输入量不大,核心是写清楚状态表示和访问标记,避免重复扩展。
网格 DFS 标准模板:把当前格置 '0' 来标记已访问,四方向递归;OD「连通区域计数/面积」题的直接原型。
岛屿数量基础上改为返回 DFS 递归路径长度并求最大;OD「区域最大体量/最远延伸」的一行改动。
多源 BFS:把所有腐烂橘子同时入队作为第 0 层,逐层扩散;OD「多起点传播最短时间/感染轮次」的经典建模。
网格回溯 DFS:按字符序尝试四方向,回溯时还原标记;OD「字符矩阵路径查找」题的完整模板。
八方向网格 BFS,队列存 (row,col,步数);OD「矩阵最短路/障碍物网格」的标准 BFS 实现。
图 DFS/BFS 遍历可达节点,用 visited 集判断能否访问全部节点;OD「钥匙/权限传递可达性」的建图 + 搜索模板。
OD 动态规划集中在三类:一维线性 DP(最大连续/最长递增子序列)、二维路径 DP(矩阵最短路/公共子序列)和背包模型(分割/计数)。掌握「定状态 → 写转移 → 确认边界」三步,各类变体迎刃而解。
Kadane:dp[i]=max(nums[i], dp[i-1]+nums[i]),「接前缀还是重新开始」;OD「最大连续子段和」的直接公式。
dp[i] = 以 nums[i] 结尾的 LIS 长度,O(n²) 转移;OD「最长递增序列/排队问题」的基本 DP 建模。
二维 dp[i][j] 表示前 i/j 字符的 LCS 长度;OD「两字符串相似度/公共结构」类题的经典二维 DP。
dp[i][j] = min(上格, 左格) + grid[i][j],边界首行首列单向累加;OD「矩阵最小代价路径」的二维 DP 模板。
完全背包:dp[amount] = min(dp[amount-coin]+1),每种硬币可重复选;OD「最少步骤/资源拼凑」无限背包模板。
0-1 背包判断:dp[j] |= dp[j-nums[i]],从大到小遍历防重选;OD「等分/目标和能否达到」的布尔背包。
OD 图题集中在:连通分量计数(并查集/DFS)、拓扑排序(依赖调度)和带权最短路(Dijkstra)。并查集处理动态连通;拓扑排序处理顺序依赖;Dijkstra 处理带权最短路。
用并查集合并直接相连的节点,最后计数根节点个数;OD「城市/团队连通分量」并查集模板的最简示例。
边入图时用并查集检测成环:两端点同根则为冗余边;OD「最小生成树/环检测」并查集应用。
BFS 拓扑排序:入度为 0 的节点入队,每处理一个节点将其邻居入度 -1;OD「任务顺序/依赖是否可完成」的拓扑判环。
拓扑排序输出节点序列而非仅判断有无环;OD「任务合法执行顺序」的拓扑排序输出版。
Dijkstra 从源点出发更新各节点最短时延,小顶堆维护待松弛节点;OD「信号传播/网络延迟」带权最短路模板。
OD 堆题集中在:Top-K 查询(快速选择 or 堆)、多路归并(k 路排序流)、实时中位数(对顶堆)。堆的本质是「随时取出当前最优元素」,明确每道题需要「最大堆还是最小堆」是解题第一步。
维护大小为 k 的小顶堆,堆顶即第 k 大;每次插入后若堆超 k 就弹出,OD「流式 Top-K」在线查询原型。
快速选择 O(n) 平均找第 k 大,或小顶堆维护 k 元素;OD「批量 Top-K」离线版,与流式版对比理解适用场景。
先哈希统计频次,再用大小为 k 的小顶堆按频次取前 K;OD「高频词/热门资源 Top-K 统计」的两阶段标准解法。
小顶堆存正在进行的会议结束时间,新会议若 ≥ 堆顶则复用房间;OD「资源分配最少数量/并行调度」的堆扫描线。
大顶堆存左半 + 小顶堆存右半,保持两堆大小差 ≤1;中位数取堆顶;OD「流式中位数/动态分位数」的对顶堆经典实现。
小顶堆同时存 k 个链表当前头节点,每次取最小接入结果链表;OD「多路有序流归并」的堆驱动多路归并模板。