问题描述
问题陈述是: 给定一个大小为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
其他升级:
-
您连续两次致电
suffix(A.size()-(B-i))+prefix(i-1))
。只需调用一次,将其存储在变量中即可重复使用。 -
您正在调用
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)