9.20华为OD机试真题 新系统 – 递增差排列 (JavaPyCC++JsGo)
2026 华为OD机试真题9月20日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
给定两个正整数 n 和 k(其中 1≤k≤n≤8),从 [1,n] 中选取 k 个元素,排成长度为 k 的有序数组,按如下条件筛选排列组合后返回:
- 数组中的元素取自整数 [1,n],且互不相同。
- 对于数组中任意连续三个元素 a[i],a[i+1],a[i+2](即长度至少为 3 时),必须满足:abs(a[i]−a[i+1])<abs(a[i+1]−a[i+2])
- 当 k<3 时,不存在需要检查的连续三个元素,条件 2 视为自动满足。
请按字典序升序返回所有可能的排列。如果不存在,返回空列表。
2026 华为OD机试真题9月20日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
输入描述
两个正整数,分别代表 n 和 k,使用英文逗号分隔。
输出描述
一个二维数组,包含所有符合条件的排列。排列之间、元素之间均使用英文逗号分隔,不添加空格。
示例1
输入
3,3
输出
[[2,1,3],[2,3,1]]
说明
- [1,2,3]:差值为 ∣1−2∣=1,∣2−3∣=1,不满足 1<1(严格递增失败)。
- [2,1,3]:差值为 1,2,满足 1<2。
- [2,3,1]:差值为 1,2,满足 1<2。
- 其余排列均不满足条件。
示例2
输入
4,2
输出
[[1,2],[1,3],[1,4],[2,1],[2,3],[2,4],[3,1],[3,2],[3,4],[4,1],[4,2],[4,3]]
说明
因为 k=2,序列中只有一对差值,没有后一对进行比较,所以任意两个不同的数字都算满足条件(按字典序输出全部排列)。
解题思路
本题采用【回溯搜索 + 剪枝】算法:使用 path 记录当前排列,使用 used 标记已经选择的数字,避免同一个数字重复出现。每一层都按 1 到 n 的顺序枚举候选值,因此最终收集到的排列天然满足字典序升序,无需额外排序。
当 path 中已经至少有两个元素时,加入新元素会产生一个新的相邻差值。只有当前差值严格大于前一个差值时才继续递归,否则立即剪枝。k<3 时不会触发该检查,所有互不相同的长度为 k 的排列都会被保留。
搜索到长度 k 后复制当前排列加入答案,再撤销本层选择继续尝试其他数字。由于 n 最大只有 8,枚举排列并在生成过程中剪枝即可满
版权声明:
作者:魔改工程师
链接:https://www.sylblog.xin/archives/874
文章版权归作者所有,未经允许请勿转载。
THE END