构造特定数组的逆序拼接问题题解
题目描述
小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. 问题分析
让我们仔细分析一下数组构造的规律:
- 对于每个数字i(从1到n),我们需要构造一个子序列
- 这个子序列是从n倒序到i的所有数字
- 最终将所有子序列拼接在一起
以n=3为例,我们可以分步骤看构造过程:
- i=1时:3,2,1
- i=2时:3,2
- i=3时:3 最终拼接:[3,2,1,3,2,3]
2. 规律总结
我们可以发现以下关键规律:
- 外层循环从1到n,控制需要构造的子序列数量
- 内层循环负责构造每个子序列,从n开始倒序直到当前的i
- 每个子序列的长度是递减的:
- 第一个子序列长度为n
- 第二个子序列长度为n-1
- 以此类推
3. 实现思路
- 创建一个空列表ans用于存储最终结果
- 使用两层循环:
- 外层循环i从1到n,表示当前要构造的子序列
- 内层循环j从n倒序到i,构造每个子序列
- 在内层循环中,将当前数字添加到结果列表中
- 最终返回构造好的列表
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
代码详解
ans = []:创建空列表存储结果for i in range(1, n + 1):外层循环,从1到nfor j in range(n, i - 1, -1):内层循环,从n倒序到i- 使用-1作为步长实现倒序
- i-1作为终止条件确保包含i本身
ans.append(j):将当前数字添加到结果列表return ans:返回最终构造的数组