本题用 DFS 回溯 生成从 [1,n] 中选出 k 个互异整数的全部排列,并在扩展序列时检查「相邻绝对差严格递增」。
从空序列开始,每次按 1,2,…,n 的顺序尝试放入一个尚未使用的数。这样先生成的完整序列一定更小,答案无需再排序即可满足字典序。
剪枝条件:当序列里已经至少有两个数时,设倒数第二个、倒数第一个和新候选分别为 x,y,z,必须满足 ∣x−y∣<∣y−z∣,否则该分支直接放弃。k<3 时不会触发该检查,因此全部 P(n,k) 都会被收下。
n≤8,全排列规模不超过 8!=40320,带剪枝的搜索足够。
给定两个正整数 n 和 k(其中 1≤k≤n≤8),从 [1,n] 中选取 k 个元素,排成长度为 k 的有序数组,按如下条件筛选排列组合后返回:
请按字典序升序返回所有可能的排列。如果不存在,返回空列表。
两个正整数,分别代表 n 和 k。
一个二维数组,包含所有符合条件的排列。
输入
3,3
输出
[[2,1,3],[2,3,1]]
说明
输入
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,序列中只有一对差值,没有后一对进行比较,所以任意两个不同的数字都算满足条件(按字典序输出全部排列)。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册