题目地址:
https://leetcode.com/problems/beautiful-array/
给定一个正整数 n n n,要求构造一个数组 A A A使得 A A A由 1 ∼ n 1\sim n 1∼n组成,并且使得 ∀ i < j < k , A [ k ] ≠ A [ i ] + A [ j ] \forall i<j<k,A[k]\ne A[i]+A[j] ∀i<j<k,A[k]=A[i]+A[j]。
容易看出,若令 f ( x ) = a x + b f(x)=ax+b f(x)=ax+b,则 f ( A ) f(A) f(A)也是满足条件的数组。如果 n n n是偶数,我们构造出由 1 ∼ n / 2 1\sim n/2 1∼n/2构成的满足条件的数组 B B B,然后构造新数组为 ( 2 B − 1 ) + 2 B (2B-1)+2B (2B−1)+2B即可(这里 ( 2 B − 1 ) (2B-1) (2B−1)指每个数乘以 2 2 2再减 1 1 1,后面的 + + +表示连接),由于左右两边满足条件,而左半边为奇数右半边为偶数,显然 i , k i,k i,k跨界取则不存在符合的 j j j,所以整个数组也满足条件。如果 n n n是奇数,则让左半边多取一个数即可。代码如下:
class Solution {
public:
vector<int> beautifulArray(int n) {
if (n == 1) return {1};
vector<int> l = beautifulArray((n + 1) / 2);
vector<int> r;
if (n % 2) r = beautifulArray(n / 2);
else r = l;
vector<int> res;
for (int x : l) res.push_back(2 * x - 1);
for (int x : r) res.push_back(2 * x);
return res;
}
};
时间复杂度 O ( n log n ) O(n\log n) O(nlogn),空间 O ( n ) O(n) O(n)。