[补题]求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  阅读(313)  评论(0编辑  收藏  举报

导航