这个题解利用了递归和分治的思想来构建漂亮数组。漂亮数组的一个关键特性是,如果一个数组是漂亮的,那么它的任何线性变换形式也是漂亮的。例如,如果array是漂亮数组,那么对于任意整数a和b,数组a * array + b也是漂亮的。基于这个性质,可以通过递归地构造较小的漂亮数组来构建更大的漂亮数组。具体来说:1. 如果n为1,直接返回[1]。2. 对于偶数n,先递归调用构造长度为n/2的漂亮数组,然后通过对这个数组的元素进行线性变换生成整个数组,前半部分元素通过2*x-1变换,后半部分通过2*x变换。3. 对于奇数n,将其拆分为两部分进行递归构造,然后同样通过线性变换合并得到结果。
时间复杂度: O(n log n)
空间复杂度: O(n log n)
class Solution:
def beautifulArray(self, n: int) -> List[int]:
if n==1:
return [1] # 基础情况:n为1时,返回[1]
if n&1==0:
tmp = self.beautifulArray(n//2) # 递归构造长度为n/2的数组
return [2*tmp[i]-1 for i in range(n//2)] + [2*tmp[i] for i in range(n//2)] # 通过线性变换构造整个数组
if n&1 == 1:
odd = self.beautifulArray(int(n/2+0.5)) # 递归构造长度为n/2+1的数组
even = self.beautifulArray(int(n/2-0.5)) # 递归构造长度为n/2的数组
for i in range(len(odd)):
odd[i]=2*odd[i]-1 # 对奇数部分的元素进行2*x-1的变换
for i in range(len(even)):
even[i] = 2*even[i] # 对偶数部分的元素进行2*x的变换
return odd+even # 合并两部分得到最终结果