X数组构造问题

107 阅读2分钟

问题描述

小S正在研究一种特殊数组XX,这个数组有两个特点:

  1. 数组是严格递增的,也就是x1<x2<⋯<xnx1​<x2​<⋯<xn​。
  2. 数组相邻元素的差值形成的新数组YY是严格递减的。即对于yi=xi+1−xiyi​=xi+1​−xi​,新数组YY满足y1>y2>⋯>yn−1y1​>y2​>⋯>yn−1​。

现在给定数组的长度n、第一个元素的值a以及最后一个元素的值b,小S想知道能否找到一个满足以上两个条件的数组XX。

**输入 **

  • n:目标数组的长度
  • a:目标数组的第一个元素值
  • b:目标数组的最后一个元素值

**输出 **

  • 如果可以找到符合条件的数组返回True,否则返回False

**约束条件 **

  • 1<n<100001<n<10000
  • 1<=a,b<=1000000001<=a,b<=100000000

测试样例

样例1:

输入:n = 3,a = 1,b = 5
输出:True

样例2:

输入:n = 5,a = 1,b = 5
输出:False

样例3:

输入:n = 5,a = 1,b = 100
输出:True

为了让这个尽可能大,所以y(i)-y(i-1)需要最小,即1。我们可以将y(i)看出是等差数列。所以反过来看就是a、b之间的数的数量和等差数列前n项和的大小关系,公差是1。

我们可以先算出等差数列y(i)的前n项和X,如果a、b的差大于这个数就表明可以构造这个数组返回true

public class Main {
    public static boolean solution(int n, int a, int b) {
        int need=n*(n-1)/2;//求前n项和
        if(a+need<=b){
            return true;
        }
        return false; // Placeholder
    }

    public static void main(String[] args) {
        System.out.println(solution(3, 1, 5) == true);
        System.out.println(solution(5, 1, 5) == false);
        System.out.println(solution(5, 1, 100) == true);
    }
}