#java #arrays #arraylist #dynamic-programming
#java #массивы #список массивов #динамическое программирование
Вопрос:
Постановка задачи такова: задан целочисленный массив A размера N.
Вы можете выбрать B элементов с левого или правого конца массива A, чтобы получить максимальную сумму. Найдите и верните эту максимально возможную сумму.
ПРИМЕЧАНИЕ: Предположим, что 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;
}
}
Я получаю ошибку времени выполнения, я попытался реализовать методы suffix и prefix, которые возвращают сумму из индекса [0, i] и sum из [i, N-i] соответственно, затем в функции solve я пытаюсь найти сумму префикса [a-1] суффикс [N-(b-a)] и узнать максимальную сумму, синтаксис полностью правильный, что-то не так с логикой, которую я предполагаю, пожалуйста, помогите мне найти правильное решение, исправив этот код вместо предоставления альтернативного метода
Комментарии:
1. пожалуйста, добавьте получаемое вами исключение во время выполнения к вашему вопросу
2. Какую ошибку времени выполнения вы получаете и какая строка ее запускает? Пожалуйста, опубликуйте всю трассировку стека.
Ответ №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 = resu<
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 resu<
}
}
Время выполнения O (n)
Сложность пространства O (1)
Ответ №2:
Вы объявляете int prefix_sum=0;
и int suffix_sum=0;
как поля, а не как локальные переменные соответствующих методов.
Вы вызываете suffix(A.size()-(B-i))
so в своем примере, который есть 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 ){
потому что вы пытаетесь спрашивать каждую итерацию «сколько чисел берется с начала»? 0, 1, 2, 3 или 4, если B равно 4
Другие обновления:
-
Вы вызываете
suffix(A.size()-(B-i)) prefix(i-1))
два раза подряд. Вызовите это только один раз, сохраните в переменной и повторно используйте. -
Вы вызываете
prefix(i-1)
, но внутри prefix() вы используете параметрa
какa 1
. Вам не нужно вычитать единицу и добавлять ее к одному и тому же