漂亮数组解法
漂亮数组:给定一个长度为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;
}
}