代码练习-最大优美排序 | 伴学笔记

55 阅读3分钟

题目描述

小C定义了一个排列是优美的,当且仅当对于任意的 i∈[1,n]i∈[1,n],都满足 aai=n−ai+1aai​​=n−ai​+1,其中 nn 表示排列的长度,aiai​ 表示排列的第 ii 个元素。她想知道,给定长度为 nn 的排列中,字典序最大的优美排列是什么?

注意,排列的定义为,长度为 nn 的序列中,11 到 nn 都出现且仅出现一次。


测试样例

样例1:

输入:n = 2
输出:[2, 1]

样例2:

输入:n = 4
输出:[4, 3, 2, 1]

样例3:

输入:n = 5
输出:[5, 4, 3, 2, 1]

解题思路

问题理解

这个问题要求我们找到给定长度 n 的排列中,字典序最大的优美排列。优美排列的定义是对于任意的 i,满足 a[i] = n - a[i+1] + 1,其中 a[i] 表示排列的第 i 个元素。排列的定义是长度为 n 的序列中,从 1 到 n 的每个数字都恰好出现一次。

关键点

  1. 排列的定义:

    • 排列是一个包含 1 到 n 的所有整数的序列,且每个整数只出现一次。
  2. 优美排列的条件:

    • 对于任意的 i,满足 a_{a_i} = n - a_i + 1

思路提示

  1. 字典序最大:

    • 题目要求字典序最大的排列。字典序最大的排列通常是从 n 到 1 的降序排列。
  2. 验证优美排列:

    • 我们需要验证生成的排列是否满足 a_{a_i} = n - a_i + 1 的条件。

具体步骤

  1. 生成降序排列:

    • 使用 range 函数生成从 n 到 1 的降序排列。
  2. 验证条件:

    • 遍历生成的排列,检查是否满足 a_{a_i} = n - a_i + 1 的条件。

示例

假设 n = 4,我们生成的排列是 [4, 3, 2, 1]

  • 对于 i = 1a_1 = 4a_4 = 1,满足 a_{a_1} = 1 = 4 - 4 + 1
  • 对于 i = 2a_2 = 3a_3 = 2,满足 a_{a_2} = 2 = 4 - 3 + 1
  • 对于 i = 3a_3 = 2a_2 = 3,满足 a_{a_3} = 3 = 4 - 2 + 1
  • 对于 i = 4a_4 = 1a_1 = 4,满足 a_{a_4} = 4 = 4 - 1 + 1

结论

通过上述分析,我们可以得出结论:从 n 到 1 的降序排列就是字典序最大的优美排列。

完整代码

def solution(n: int) -> list:
    list(range(n,0,-1))
    return list(range(n, 0, -1))

if __name__ == '__main__':
    print(solution(2) == [2, 1])
    print(solution(4) == [4, 3, 2, 1])
    print(solution(5) == [5, 4, 3, 2, 1])

学习总结

通过这个问题,我们学习了如何理解和分析优美排列的定义,以及如何构造满足特定条件的排列。我们使用了从大到小排列的策略,结合优美排列的定义,成功地找到了字典序最大的优美排列。这个过程不仅锻炼了我们的逻辑推理能力,还提高了我们对数学问题的理解和解决能力。