问题描述
小C定义了一个排列是优美的,当且仅当对于任意的 𝑖∈[1,𝑛]i∈[1,n],都满足 𝑎𝑎𝑖=𝑛−𝑎𝑖+1aai=n−ai+1,其中 𝑛n 表示排列的长度,𝑎𝑖ai 表示排列的第 𝑖i 个元素。她想知道,给定长度为 𝑛n 的排列中,字典序最大的优美排列是什么?
注意,排列的定义为,长度为 𝑛n 的序列中,11 到 𝑛n 都出现且仅出现一次。
测试样例
样例1:
输入:
n = 2
输出:[2, 1]
样例2:
输入:
n = 4
输出:[4, 3, 2, 1]
样例3:
输入:
n = 5
输出:[5, 4, 3, 2, 1]
题解:
为了解决这个问题,我们需要理解小C定义的优美排列的性质。优美排列要求对于排列中的每一个元素 a_i,都满足 a_a_i = n - a_i + 1。这意味着对于排列中的每一个元素 a_i,它在排列中的位置 i 和它对应的值 a_i 之间存在一个特定的关系。
我们可以从排列的末尾开始构建这个排列,因为这样可以确保我们得到的是字典序最大的排列。我们可以按照以下步骤来构建这个排列:
-
初始化:我们从排列的末尾开始构建,初始化一个空列表来存储结果。
-
构建排列:我们从
n开始,依次将n,n-1, ...,1添加到列表中。 -
验证:在构建过程中,我们需要验证每个元素
a_i是否满足a_a_i = n - a_i + 1。由于我们是从n开始构建的,并且每个元素都是唯一的,我们可以确保这个条件总是满足的。
以下是解决这个问题的代码:
import java.util.*;
public class Main {
public static List<Integer> solution(int n) {
List<Integer> result = new ArrayList<>();
// 从 n 开始,依次将 n, n-1, ..., 1 添加到列表中
for (int i = n; i >= 1; i--) {
result.add(i);
}
return result;
}
public static void main(String[] args) {
System.out.println(solution(2).equals(Arrays.asList(2, 1)));
System.out.println(solution(4).equals(Arrays.asList(4, 3, 2, 1)));
System.out.println(solution(5).equals(Arrays.asList(5, 4, 3, 2, 1)));
}
}
这段代码首先初始化一个空列表 result。然后,它从 n 开始,依次将 n, n-1, ..., 1 添加到列表中。由于我们是从 n 开始构建的,并且每个元素都是唯一的,我们可以确保这个排列满足小C定义的优美排列的性质。最后,它返回结果列表。