漂亮数组解法

漂亮数组:给定一个长度为N的数组arr,该数组由1到N的整数来组成,且满足arr[k]*2不等于arr[i]+arr[j]  (i<k<j)

 

例如:

长度为4的数组:{2,1,4,3} 

长度为8的数组:[1,5,3,7,2,6,4,8]

 

假设一个数组为漂亮数组,则该数组一定满足下列条件:

(1)数组中的每一个数加上一个任意整数,依旧维持漂亮数组。

例如:将{2,1,4,3}全部加一

得到  {3,2,5,4}  依旧满足

 

(2)将数组中的每一个数都乘上一个非0整数,依旧满足

例如:将{2,1,4,3}都乘2

得到{4,2,8,6}

 

(3)最重要的一条来了,将一个全是奇数的漂亮数组和一个全是偶数的漂亮数组合并在一起,依旧是一个漂亮数组。

例如:将{2,1,4,3}都乘2

得到偶数漂亮数组{4,2,8,6}

再将这个偶数数组全部-1,得到奇数数组{3,1,7,5}

将这两个数组合并,得到{3,1,7,5,4,2,8,6}依然满足规则。

所以可以通过这个规则,获得长度为4,8,16,32....的漂亮数组

 

(4)最后一个规则,就是漂亮数组中删去一个数,依旧能保持漂亮数组

 

代码如下:

class Solution {
    public int[] beautifulArray(int N) {
        int array[] = new int[2000];
        int array2[] = new int[N];
        int k  =0;
        array[0] = 2;
        array[1] = 1;
        array[2] = 4;
        array[3] = 3;
        for(int i = 1;i<200;i*=2){
            for(int j = 0;j<i*4;j++){
                array[i*4+j] = array[j]*2;
                array[j] = array[j]*2-1;
            }
        }
        
        for(int i = 0;i<2000;i++){
            if(k<N&&array[i]!=0&&array[i]<=N){
               
                array2[k] = array[i];
                k++;
            }
                
        }
        
        return array2;
    }
}

 

posted @ 2019-10-03 15:11  时光易久  阅读(1354)  评论(0编辑  收藏  举报