[补题]求a[i]+a[j]+i-j的最大值,要求i<j
题目
如题。
例:
输入:
5
11 6 5 18 12
输出:
29
题解
- 思路:
- 一直是按着(a[i]+a[j])+(i-j)想后序的思路,不应该限制住自己,应该多考虑拆的方法。正确思路是把a[i]+a[j]+i-j拆成(a[i]+i)+(a[j]-j)。
- 解法:
- 由于题目要求i<j,所以遍历一遍数组,把每个j的对应最大a[i]+i对应存到另一个数组里。
- 然后再遍历一遍,求目标最大即可。
时间复杂度:O(n).
代码
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;++i) {
arr[i]=in.nextInt();
}
int maxVal=getMaxVal(arr);
System.out.print(maxVal);
}
public static int getMaxVal(int[] arr) {
int[] sum=new int[arr.length];//存对应位置之前出现的最大arr[i]+i;
int maxSum=Integer.MIN_VALUE;
for(int i=0;i<arr.length-1;++i) {
sum[i]=Math.max(maxSum, arr[i]+i);
}
int maxAns=Integer.MIN_VALUE;//arr[j]-j+arr[i]+i ,i<j 的最大值
for(int j=1;j<arr.length;++j) {
maxAns=Math.max(maxAns, arr[j]-j+sum[j-1]);
}
return maxAns;
}
}
posted on 2019-05-28 23:56 coding_gaga 阅读(320) 评论(0) 编辑 收藏 举报