递归构造数组

构造数组

题目:
给定一个整数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,称作奇变换
有:
(2
a[i]+1)+(2a[j]+1) !=2(2a[k]+1)
同样可以证明式子成立,那么也扩充了一组数据。
有奇变换,那么相应的就有偶变换
(2
a[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) {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值