解法
记忆性递归
- 很容易分析出来,只有当
A[i]+A[j]
为偶数的时候才存在“不漂亮”的可能,那么A[i]
和A[j]
必须同奇或同偶 - 所以一个想法是把奇数和偶数分开来,然后只要奇数是漂亮数组,偶数也是漂亮数组就好了,到这一步都比较好想,然后我就卡住了
- 递归思想寄托在第三步里 现在我有1…N,不妨假设N为偶数,那么,奇数那边分别是:
1, 3, ..., N-1
,偶数那边是2,4,6,...,N
。
令n=N/2
,那么奇数那边可以表示成:2*1-1, 2*2-1, ...2*n-1
,而偶数那边可以表示成:2*1, 2*2, 2*3, ..., 2*n
。
我们发现:奇数组和偶数组都是1..n
这个连续数组的线性变换! - 现在显然,如果想求N的漂亮数组,我们只要求n的漂亮数组,然后把它们通过线性变换然后组合起来就可以了!
- 当N为奇数的时候,也有相似的结论
class Solution(object):
def beautifulArray(self, N):
"""
:type N: int
:rtype: List[int]
"""
f = {
1: [1],
2: [1,2],
}
def solve(N):
if N not in f:
f[N] = map(lambda x:2*x-1, solve(N-N/2))+map(lambda x:2*x, solve(N/2))
return f[N]
return solve(N)