问题描述
小S正在研究一种特殊数组XX,这个数组有两个特点:
- 数组是严格递增的,也就是x1<x2<⋯<xnx1<x2<⋯<xn。
- 数组相邻元素的差值形成的新数组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);
}
}