题目:
构造一个长度为N的数组,对任意的i<k<j,满足
a[i]+a[j]!=2a[k]。
解题思路:
1.当数组中只有1时,一定是达标的。
2.那么我们可以从已达标的数组进行扩展。
对于已经成立的数组 对他进行奇数扩展后,仍然成立。同样的 对他进行偶数扩展后,也一定是成立的。
比如 如果数组arr中只有1,那就是i=0的位置。
对于奇数扩展:arr[i]*2+1;i
对于偶数扩展:arr[i]*2;
此时组成新数组{3,2};
同理,奇数扩展后{7,5}
偶数扩展后{6,4}
那么新数组就是{7,5,6,4},显然成立!
依次推论。那么可以采用递归思路。
他们各自组成的数组是成立的 就把已成立的奇数数组放在左边 已经成立的偶数数组放在右边 对于合并在一起的时候必定是成立的 因为简单的数学加减即可验证 必定成立。
那么经过上述分析,就可以得出:
如果我们需要得到长度为N的数组,那么需要(N+1)/2个数字即可。因为奇数扩展+偶数扩展 即可得到长度为N 的数组。
为什么不是N/2?
因为他只能向上扩展。比如N为7 ,那么许需要4个数即可。
它可以扩展出8个,那定然可以是7个丫 但是如果是N/2,他就变成了3个,那就不够了。
代码:
public class shuzuConstruct {
public static int[] method(int N){
if(N==1) return new int[]{1};
int half=(N+1)/2;
int[] temp = method(half);
//开始奇数扩展
int []res=new int[N];
int index=0;
for(;index<half;index++){
res[index]=temp[index]*2+1;
}
for(int i=0;index<N;i++,index++){
res[index]=temp[i]*2;
}
return res;
}
public static void main(String[] args) {
int[] ints = method(5);
for(int a:ints){
System.out.println(a);
}
}
}