Algorithm 访问-大小为N的整数A数组,索引为0<;=P<;=Q<;N、 编写一个函数以查找最大值(a[Q]+;a[P]+;Q-P)

Algorithm 访问-大小为N的整数A数组,索引为0<;=P<;=Q<;N、 编写一个函数以查找最大值(a[Q]+;a[P]+;Q-P),algorithm,Algorithm,我收到了这个面试问题,但我不知道如何解决它: 我们为您提供了一个大小为N的整数数组A。对于索引0,从数组的右端开始,并维护一个变量,让我们调用max\u q,它将是您考虑的A[q]+q值的最大值。最初max\u q=A[N-1],更新规则是max\u q=max(max\u q,A[i]+i)。现在考虑您选择 i-th>代码>元素作为您的代码> p>代码>,因此答案将是结果= max(结果,max sq+a[i] -i)。你应该先更新result,然后更新max_q似乎你想最大化A[q]+q和A

我收到了这个面试问题,但我不知道如何解决它:


我们为您提供了一个大小为N的整数数组A。对于索引0,从数组的右端开始,并维护一个变量,让我们调用
max\u q
,它将是您考虑的
A[q]+q
值的最大值。最初
max\u q=A[N-1]
,更新规则是
max\u q=max(max\u q,A[i]+i)
。现在考虑您选择<代码> i-th>代码>元素作为您的代码> p>代码>,因此答案将是<代码>结果= max(结果,max sq+a[i] -i)。你应该先更新
result
,然后更新
max_q

似乎你想最大化
A[q]+q
A[p]-p
。因此有一个简单的解决方案,通过计算所有可能的(A[q]+A[p]+q-p)值,找到最大值。。。但这将是O(N^2),而不是O(N)。编辑:前面的评论似乎是一个有趣的方法。两个表达式的Find maximum/min分别是O(N),2*O(N)仍然是O(N)是的,更有意义:)因为表达式是A[Q]+Q-(P-A[P]),你想要A[Q]-Q的max和P-A[P]的min,那么A[P]-PSeems的max很棒,如果我用Java编写算法,我怎么能在记事本中向采访者展示?创建一个将数组作为参数传递并返回整数的方法?我用代码更新了问题,是否正确?否,这是
O(N^2)
解决方案,去掉第二个
,首先从
q=a.length-2
开始。然后,首先更新
结果
,然后更新
max_q
。如何获取“p”值?
int[] a = new int[] {3,5,2,1,2};
int max_q=a[a.length-1];
int result = 0;
for(int q=a.length-2; q>=0; q--) {
    result = Math.max(result, max_q + a[p]-p);
    max_q = Math.max(max_q,a[q]+q);
}
System.out.println(result);