对于某些固定的 N
,如果数组 A
是整数 1, 2, ..., N
组成的排列,使得:
对于每个 i < j
,都不存在 k
满足 i < k < j
使得 A[k] * 2 = A[i] + A[j]
。
那么数组 A
是漂亮数组。
给定 N
,返回任意漂亮数组 A
(保证存在一个)。
示例 1:
输入:4 输出:[2,1,4,3]
示例 2:
输入:5 输出:[3,1,2,5,4]
---------------------------------------------------------------------------------------------------------------------------------------------------
这里给出一种构造思路:
假如我们已经得到了两个漂亮数组,分别由[1,2,...N/2] 和 [1,2,....(N+1)/2] 构成(这里没有指定漂亮数组内的排列顺序)
那么我们只需要将第一个漂亮数组[1,2,...N/2] 乘以2,将第二个漂亮数组[1,2,....(N+1)/2]乘以2再减1,就得到了完整的漂亮数组。
为什么呢?
因为左边的数组乘以2之后都是偶数了,右边的数组乘以2再减1之后都是奇数。而且这两个数组仍然是漂亮数组。
(A[k]−1)∗2 = A[k]∗2−2 ≠ ( A[i]−1 + A[j]−1)
A[k]∗2∗2 ≠ (A[i] + A[j])∗2 =A[i]∗2 + A[j]∗2
那么拼接之后仍然是漂亮数组,因为左边奇数,右边偶数,左边的数加右边的数必定为奇数。
A左 + A右 = 奇数 ≠ 2*A[k] = 偶数
-------------------------------------------
因此递归即可。递归终止条件为N=1,返回数组 new int[]{1}即可
import java.util.*;
class Solution {
public int[] beautifulArray(int N) {
if(N==1){
return new int[]{1};
}
int[] even = beautifulArray(N/2);//[1-N]中的偶数构成的漂亮数组
int[] odd = beautifulArray((N+1)/2);//[1-N]中的奇数构成的漂亮数组
int[] beautiful = new int[N];
for(int i = 0;i<even.length;i++){
beautiful[i] = even[i]*2;
}
for(int i = 0;i<odd.length;i++){
beautiful[i+even.length] = odd[i]*2-1;
}
return beautiful;
}
}