2020-10-29:数组

题目:

构造一个长度为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);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值