解题思路
本题要求构造一个长度为 n 的排列(每个整数 1 到 n 恰好出现一次),使得排列的“错位”总数恰好等于给定的 k。这里“错位”的定义即为通常的逆序对:若 i<j 且 ai>aj,则 (i,j) 是一对错位。
我们可以使用贪心策略,从 1 到 n 依次确定每个位置的数字。用两个指针 L=1 和 R=n 维护当前还未使用的数字区间 [L,R]:
- 选择最大值 R:如果我们将当前剩余数字中的最大值 R 放在序列的下一个位置,由于后面将要放置的 R−L 个数字都比 R 小,它们会和 R 形成 R−L 个错位。
- 选择最小值 L:如果我们把最小值 L 放在下一个位置,则它和后面所有剩余数字都不会形成错位(因为后面的数字都大于 L)。