构造数组
题目:
给定一个整数N,构造一个长度为N的数组a,对于任意的i<k<j,
满足a[i]+a[j]!=2*a[k]
分析
可以类比数学归纳法,假定一组数据成立,判断另外一组是否也成立。
1、当只有一个数字时,肯定满足题意,比如 a={1}
2、当数组中存在a[i]+a[j]!=2a[k]
那么存在一种变换:
如对每个数都进行+1操作,使得操作后的数,也满足式子成立:
(a[i]+1)+(a[j]+1) !=2(a[k]+1),这样就根据原有的数据扩充了一组数据。
同样的我们是否可以做一个变换:
对每个数变成2倍加+1,称作奇变换
有:
(2a[i]+1)+(2a[j]+1) !=2(2a[k]+1)
同样可以证明式子成立,那么也扩充了一组数据。
有奇变换,那么相应的就有偶变换
(2a[i])+(2a[j]) !=2(2*a[k])
又扩充了一组数据。
这样就可以无限的扩充下去。
那么奇变换和偶变换组成的数组在将原数组扩大一倍的情况下,是否能够满足题意呢。答案是肯定的,分析如下:
将奇变换数组和偶变换数组拼接起来,我们可以证明这种方式是满足题意的。
【【奇变换数组】【偶变换数组】】
1、当i,j都在奇变换数组中,满足题意,我们做的原假设就是如此
2、当i,j都在偶变换数组中,也满足题意。
3、当i在奇变换数组中,而j在偶变换数组中,这是我们需要重点考虑的。实际上这种情况也是符合条件的,
因为 a[i]+a[j]是一个奇数与一个偶数相加,其结果一定是奇数,而2*a[k]一定是偶数,他们一定不相等。
代码实现
public static int[] makeArr(int size) {