932. Beautiful Array

解法

记忆性递归

  1. 很容易分析出来,只有当A[i]+A[j]为偶数的时候才存在“不漂亮”的可能,那么A[i]A[j]必须同奇或同偶
  2. 所以一个想法是把奇数和偶数分开来,然后只要奇数是漂亮数组,偶数也是漂亮数组就好了,到这一步都比较好想,然后我就卡住了
  3. 递归思想寄托在第三步里 现在我有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这个连续数组的线性变换!
  4. 现在显然,如果想求N的漂亮数组,我们只要求n的漂亮数组,然后把它们通过线性变换然后组合起来就可以了!
  5. 当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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值