932. Beautiful Array

在这里插入图片描述

几乎不可能自己想出来的答案。
https://leetcode.com/problems/beautiful-array/discuss/186679/Odd-%2B-Even-Pattern-O(N)
重要的几点:
1.分治。而且分成奇数和偶数部分,这样就不会有merge的问题。
2.几个性质:
一个beautiful array经过下面的操作之后,仍然是beautiful的。
1)删除其中元素
2)每个元素都乘以某个值(非零)
3)每个元素都加上某个值

这样的话,我们就可以从最小的beautiful array开始一步一步扩大:
将它从1~n变为从1~2n,而且奇数在前面,偶数在后面。

class Solution {
public:
    vector<int> beautifulArray(int N) {
        vector<int> ret{1};
        while (ret.size() < N) {
            vector<int> temp;
            for (int i : ret)
                if (2*i-1 <= N)
                    temp.push_back(2*i-1);
            for (int i : ret)
                if (2*i <= N)
                    temp.push_back(2*i);
            ret.swap(temp);
        }
        return ret;
    }
};
posted @ 2019-09-21 14:40  于老师的父亲王老爷子  阅读(21)  评论(0)    收藏  举报