从双方挑?

问题描述

问题陈述是: 给定一个大小为N的整数数组A。

您可以从数组A的左端或右端选择B个元素以获取最大和。 查找并返回此最大可能和。

注意:假设B = 4,并且数组A包含10个元素,则:

您可以选择前四个元素,也可以选择后四个元素,或者可以从前面选择1,从后面选择3等。您需要返回可以选择的最大元素总数。

public class Solution {
ArrayList<Integer> c = new ArrayList<>();
ArrayList<Integer> A= new ArrayList<>();
public int solve(ArrayList<Integer> A,int B) {
   
    if (B>A.size()){
        int sum=0;
        for(int i=0;i<A.size();i++)
         sum= sum+A.get(i);
        return sum;
    }

   int max_sum=0;
 for(int i=0;i<A.size();i++){
  if((max_sum<suffix(A.size()-(B-i))+prefix(i-1)) ){
       max_sum=suffix(A.size()-(B-i))+prefix(i-1);
     }
    }
    return max_sum;
}
    
    int prefix_sum=0;
  int prefix(int a)   {
      
       for(int p=0;p<a+1;p++){
           c=A;
            prefix_sum=prefix_sum + c.get(p);
            }
          return prefix_sum;
                     }

           int suffix_sum=0;
           int suffix(int b){
               c=A;
        for(int q=b;q<c.size();q++){
           suffix_sum=suffix_sum+c.get(q);
          }
            return suffix_sum;
         }

}

我遇到运行时错误,我尝试实现后缀和前缀方法,该方法分别从index [0,i]和[i,Ni]返回和,然后在solve函数中尝试找到前缀[a-1] +后缀[N-(ba)]的总和,找出最大和,语法是完全正确的,我假设的逻辑有问题,请通过以下方法帮助我找到正确的解决方案:更正此代码,而不是提供替代方法

解决方法

您将int prefix_sum=0;int suffix_sum=0;声明为字段,而不是相应方法的局部变量。

您正在呼叫suffix(A.size()-(B-i)),因此您的示例是10 - (4 -i),即6 + i。您迭代i的范围是{0,...,10},因此值6 + i将是6到16的所有数字。您无法在9之上的数组中建立索引,因此得到一个例外。

您需要更改

for(int i=0;i<A.size();i++){

for(int i=0; i <= B; i++){

因为您要询问每个迭代“从一开始就取了多少个数字”?如果B为4,则为0、1、2、3或4


其他升级:

  1. 您连续两次致电suffix(A.size()-(B-i))+prefix(i-1))。只需调用一次,将其存储在变量中即可重复使用。

  2. 您正在调用prefix(i-1),但是在prefix()中,您将参数a用作a + 1。您无需减去一,也可以在同一事物上加一

,
    package com.array;

    import java.util.Arrays;
    import java.util.List;

    public class PickFromBothSides {

        public static void main(String[] args) {
            Integer[] arr = { 5,-2,3,1,2 };
            System.out.println(solve(Arrays.asList(arr),3));

        }

        public static int solve(List<Integer> A,int B) {

            int n = A.size();

            int result = 0;

            for (int i = 0; i < B; i++) {
                result += A.get(i);
            }

            int sum = result;

            for (int i = 0; i < B; i++) {
                sum -= A.get(B - 1 - i);
                sum += A.get(n - 1 - i);

                result = Math.max(result,sum);
            }

            return result;

        }
    }

运行时O(n) 空间复杂度O(1)