构造特定数组的逆序拼接问题-题解

96 阅读2分钟

构造特定数组的逆序拼接问题题解

题目描述

小U得到了一个数字n,他的任务是构造一个特定数组。这个数组的构造规则是:对于每个从1到n的数字,将数字n到i逆序拼接,直到等于n为止。最终,输出这个拼接后的数组。

示例

示例 1:

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

示例 2:

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

示例 3:

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

解题思路

1. 问题分析

让我们仔细分析一下数组构造的规律:

  1. 对于每个数字i(从1到n),我们需要构造一个子序列
  2. 这个子序列是从n倒序到i的所有数字
  3. 最终将所有子序列拼接在一起

以n=3为例,我们可以分步骤看构造过程:

  • i=1时:3,2,1
  • i=2时:3,2
  • i=3时:3 最终拼接:[3,2,1,3,2,3]

2. 规律总结

我们可以发现以下关键规律:

  1. 外层循环从1到n,控制需要构造的子序列数量
  2. 内层循环负责构造每个子序列,从n开始倒序直到当前的i
  3. 每个子序列的长度是递减的:
    • 第一个子序列长度为n
    • 第二个子序列长度为n-1
    • 以此类推

3. 实现思路

  1. 创建一个空列表ans用于存储最终结果
  2. 使用两层循环:
    • 外层循环i从1到n,表示当前要构造的子序列
    • 内层循环j从n倒序到i,构造每个子序列
  3. 在内层循环中,将当前数字添加到结果列表中
  4. 最终返回构造好的列表

4. 复杂度分析

  • 时间复杂度:O(n²)
    • 外层循环执行n次
    • 内层循环在第i次外层循环时执行(n-i+1)次
    • 总执行次数为n + (n-1) + ... + 1 = n(n+1)/2
  • 空间复杂度:O(n²)
    • 需要存储最终的结果数组
    • 结果数组的长度同样是n(n+1)/2

代码实现

def solution(n):
    ans = []
    for i in range(1, n + 1):
        for j in range(n, i - 1, -1):
            ans.append(j)
    return ans

代码详解

  1. ans = []:创建空列表存储结果
  2. for i in range(1, n + 1):外层循环,从1到n
  3. for j in range(n, i - 1, -1):内层循环,从n倒序到i
    • 使用-1作为步长实现倒序
    • i-1作为终止条件确保包含i本身
  4. ans.append(j):将当前数字添加到结果列表
  5. return ans:返回最终构造的数组