zoukankan      html  css  js  c++  java
  • [补题]求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;
    	}
    }
    
  • 相关阅读:
    228. Summary Ranges
    227. Basic Calculator II
    224. Basic Calculator
    222. Count Complete Tree Nodes
    223. Rectangle Area
    221. Maximal Square
    220. Contains Duplicate III
    219. Contains Duplicate II
    217. Contains Duplicate
    Java编程思想 4th 第4章 控制执行流程
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10940136.html
Copyright © 2011-2022 走看看