题目描述:对于某些固定的 N,如果数组 A 是整数 1, 2, …, N 组成的排列,使得:
对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[k] * 2 = A[i] + A[j]。
那么数组 A 是漂亮数组。
给定 N,返回任意漂亮数组 A(保证存在一个)。
解题思路:(1)漂亮数组进行放射变换之后还是漂亮数组(2)如果左边的漂亮数组都是奇数,右边的漂亮数组都是偶数,那么左边加上右边也是漂亮数组,因为奇数+偶数一定是奇数
方案一:动态规划
class Solution:
def beautifulArray(self, N: int) -> List[int]:
tabel = {1:[1]}
for i in range(2, N+1):
tmp = []
left = (i + 1) // 2
for num in tabel[left]:
tmp.append(num * 2 - 1)
right = i // 2
for num in tabel[right]:
tmp.append(num * 2)
tabel[i] = tmp
return tabel[N]
方案二:分治+递归+记忆化
class Solution:
def beautifulArray(self, N: int) -> List[int]:
tabel = {1:[1]}
def f(n):
if n in tabel:
return tabel[n]
left = f((n+1) // 2)
right = f(n // 2)
tabel[n] = [2*l-1 for l in left] + [r * 2 for r in right]
return tabel[n]
return f(N)