LeetCode 932. 漂亮数组

对于某些固定的 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;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_39638957/article/details/88815565